【发布时间】:2015-04-26 13:52:38
【问题描述】:
我正在尝试创建出队结构来插入/删除第一个节点,插入/删除最后一个节点。我已经在一个 .c 文件中编写了所有内容并且它运行良好,但是当我尝试从中创建一个项目文件(3 个文件:主文件、标题、函数)时,它就不起作用了。制作项目后遇到的第一个问题:打印出列无限次(函数void printDeque(deque *d))。
这是工作的单文件代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct dequeNode *link;
struct dequeNode{
int data;
link next;
};
typedef struct{
link front;
link rear;
}deque;
void initDeque(deque *d){ //Create new deque
d->front=NULL;
d->rear=NULL;
}
int isEmpty(deque *d){ //Function to find, if deque is empty
if((d->front)==NULL){
return 0;
}else{
return 1;
}
}
void putFront(deque *d,int x){ //Function to insert data in front of deque
link node=(link)malloc(sizeof(struct dequeNode));
node->data=x;
node->next=NULL;
if(isEmpty(d)){
node->next=d->front;
d->front=node;
}else{
d->front=node;
d->rear=node;
}
}
void putRear(deque *d,int x){ //Function to insert data in rear of deque
link node=(link)malloc(sizeof(struct dequeNode));
node->data=x;
node->next=NULL;
if(isEmpty(d)){
d->rear->next=node;
d->rear=node;
}else{
d->front=node;
d->rear=node;
}
}
int getFront(deque *d){ //Delete first node of deque
link node=d->front;
int x=node->data;
if((d->front)==(d->rear)){
d->front=NULL;
d->rear=NULL;
}else{
d->front=node->next;
}
free(node);
return x;
}
int getRear(deque *d){ //Delete last node of deque
link node=d->front;
link tr=d->rear;
int x=tr->data;
if(node==tr){
d->front=NULL;
d->rear=NULL;
}else{
while((node->next)!=tr){
node=node->next;
}
d->rear=node;
node->next=NULL;
}
free(tr);
return x;
}
void printDeque(deque *d){ //Print out deque to console
link node=d->front;
while(node!=NULL){
printf("%d ",node->data);
node=node->next;
}
}
void main(){
int x;
deque *d;
d=(deque*)malloc(sizeof(deque));
initDeque(d);
putFront(d,10);
putFront(d,20);
putRear(d,30);
putFront(d,40);
putRear(d,50);
putFront(d,60);
printf("\n");
printDeque(d);
if(isEmpty(d))
x=getFront(d);
printf("\n");
printDeque(d);
if(isEmpty(d))
x=getRear(d);
printf("\n");
printDeque(d);
if(isEmpty(d))
x=getFront(d);
printf("\n");
printDeque(d);
}
这里有三个文件可以用来制作一个项目:
main.c
#include<stdio.h>
#include<stdlib.h>
#include"deque.h"
void main(){
int x;
deque *d;
d=(deque*)malloc(sizeof(deque));
initDeque(d);
putFront(d,10);
putFront(d,20);
printDeque(d);
putRear(d,30);
putFront(d,40);
putRear(d,50);
putFront(d,60);
printf("\n");
printDeque(d);
if(isEmpty(d))
x=getFront(d);
printf("\n");
printDeque(d);
if(isEmpty(d))
x=getRear(d);
printf("\n");
printDeque(d);
if(isEmpty(d))
x=getFront(d);
printf("\n");
printDeque(d);
}
头文件(deque.h):
#ifndef deque_H
#define deque_H
typedef struct dequeNode *link;
struct dequeNode{
int data;
link next;
};
typedef struct{
link front;
link rear;
}deque;
void initDeque(deque*);
int isEmpty(deque*);
void putFront(deque*,int);
void putRear(deque*,int);
int getFront(deque*);
int getRear(deque*);
void printDeque(deque*);
#endif
和函数文件(functions.c):
#include<stdio.h>
#include<stdlib.h>
#include"deque.h"
void initDeque(deque *d){ //Create new deque
d->front=NULL;
d->rear=NULL;
}
int isEmpty(deque *d){ //Function to find, if deque is empty
if((d->front)==NULL){
return 0;
}else{
return 1;
}
}
void putFront(deque *d,int x){ //Function to insert data in front of deque
link node=(link)malloc(sizeof(struct dequeNode));
node->data=x;
node->next=NULL;
if(isEmpty(d)){
node->next=d->front;
d->front=node;
}else{
d->front=node;
d->rear=node;
}
}
void putRear(deque *d,int x){ //Function to insert data in rear of deque
link node=(link)malloc(sizeof(struct dequeNode));
node->data=x;
node->next=NULL;
if(isEmpty(d)){
d->rear->next=node;
d->rear=node;
}else{
d->front=node;
d->rear=node;
}
}
int getFront(deque *d){ //Delete first node of deque
link node=d->front;
int x=node->data;
if((d->front)==(d->rear)){
d->front=NULL;
d->rear=NULL;
}else{
d->front=node->next;
}
free(node);
return x;
}
int getRear(deque *d){ //Delete last node of deque
link node=d->front;
link tr=d->rear;
int x=tr->data;
if(node==tr){
d->front=NULL;
d->rear=NULL;
}else{
while((node->next)!=tr){
node=node->next;
}
d->rear=node;
node->next=NULL;
}
free(tr);
return x;
}
void printDeque(deque *d){ //Print out deque to console
link node=d->front;
while(node!=NULL){
printf("%d ",node->data);
node=node->next;
}
}
第二个问题:我在int main 中创建了第一个节点deque *d; d=(deque*)malloc(sizeof(deque));,但是是否有可能在其中创建它,比如说void initDeque()?
【问题讨论】:
-
我注意到的第一件事:你在
main中注释掉了InitDeque。 -
对不起,我上次调试程序后没有删除
//的错误。已编辑帖子。 -
针对第二个问题:如果将
initDeque声明为deque *initDeque(void),那么可以在函数内部调用malloc并返回指针。 -
所发布的代码,作为三个模块工作得很好:返回 5 行,具有预期的结果。
-
谢谢你们的快速回答。问题出在我的电脑上,因为当我在另一台电脑上尝试时,代码工作得很好。还有user3386109,你能在答案部分展示那段代码的例子吗?因为我有点迷失在那个结构中。