2015-02-24 56 views
0

我试图创建出队结构来插入/删除第一个节点,插入/删除最后一个节点。我已经把所有的东西写在一个.c文件中,并且它工作的很完美,但是当我试图制作一个项目文件(3个文件:main,header,functions)时,它不起作用。制作项目后遇到的第一个问题:打印出队无限次(功能void printDeque(deque *d))。C中的双端队列结构问题

这里的工作一file'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); 
} 

头文件(双端队列.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 

and fu nction文件(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()

+0

我注意到的第一件事:你在'main'中注释了'InitDeque'。 – user3386109 2015-02-24 19:22:17

+0

对不起,我上次调试程序后没有删除''//''。编辑后。 – 2015-02-24 19:23:50

+0

针对第二个问题:如果你将'initDeque'声明为'deque * initDeque(void)',那么你可以在函数内部调用'malloc'并返回指针。 – user3386109 2015-02-24 19:30:37

回答

0

您遇到的第一个问题 - isEmpty()函数中的错误。如果是NULL,你应该返回true,如果不是NULL - 你应该返回false。

UPD。为保持其余代码不变,您可以将isEmpty重命名为isNotEmpty(如假定的isedev)。此外,值得添加的检查在这个函数中“d”指针是否等于NULL:

//Function to find, if deque is not empty 
int isNotEmpty(deque *d) 
{ 
    if (!d || !d->front) 
     return 0; 
    return 1; 
} 
+1

虽然该函数可能应该重命名为“isNotEmpty”,但它在代码中的使用没有逻辑错误。 – isedev 2015-02-24 19:35:53

+0

和评论可能应该重新命名呢?别让我笑 – ars 2015-02-24 19:38:17

+0

@isedev你错了。指针d可以等于NULL。所以有效的条件将返回d == NULL || D->前== NULL; – 2015-02-24 19:39:00