2016-08-27 32 views
0

我试图使用以下结构使用链接列表实现队列。但在排队功能,就在评论下面,我得到了上面提到的错误。这个错误已经发生,而同样的在这个链接http://quiz.geeksforgeeks.org/queue-set-2-linked-list-implementation/给出的代码中使用。有一个我用来运行代码的评论。但我不明白为什么我得到这个错误。请帮忙 !'结构队列'没有名为'next'的成员。

#include<stdio.h> 
    #include<stdlib.h> 

    struct node 
    { 
     int data; 
     struct node *next; 
    }; 

    struct queue 
    { 
     struct queue *front; 
     struct queue *rear; 
    }; 

    struct queue* createQueue(); 
    void enqueue(struct queue *q,int info); 
    int dequeue(struct queue *q); 
    void display(struct queue *q); 
    int isEmpty(struct queue *q); 
    void menu(); 

    struct queue* createQueue() 
    { 
     struct queue *new_queue; 
     new_queue = (struct queue*) malloc(sizeof(struct queue)); 
     if(new_queue != NULL) 
     { 
      return ; 
     } 
     new_queue->front = new_queue->rear = NULL; 
     return new_queue; 
    } 
    int isEmpty(struct queue *q) 
    { 
     if(q->front == NULL) 
      return 1; 
    } 

    void enqueue(struct queue *q,int info) 
    { 
     struct node *temp,*temp1; 
     temp = (struct node*) malloc(sizeof(struct node)); 
     if(temp == NULL) 
      return ; 
     temp->data = info; 
     temp->next = NULL; 
     if(q->front == NULL && q->rear == NULL) 
     { 
      q->front = temp; 
      q->rear = temp; 
     } 
     if(q->rear != NULL) 
     { 
      //temp1 = q->rear; 
      q->rear->next = temp; 
      q->rear = temp; 
     } 
    } 

    int dequeue(struct queue *q) 
    { 
     if(isEmpty(q) == 1) 
     { 
      printf("Empty list!"); 
     } 
     struct node *temp = q->front; 
     q->front = temp->next; 
     int data = temp->data; 
     free(temp); 
     return (data); 
    } 

    void display(struct queue *q) 
    { 
     struct node *start,*end = NULL; 
     start = q->front; 
     end = q->rear; 
     if(isEmpty(q) == 1) 
     { 
      printf("Empty List!"); 
     } 
     while(start != NULL) 
     { 
      printf("%d",start->data); 
      start = start->next; 
     } 
    } 

    void menu() 
    { 
     int choice = 0; 
     int input = 0; 
     struct queue *q; 
     while(1) 
     { 
      printf("\t\tMain Menu\n"); 
      printf("\t0.Create Queue\n"); 
      printf("\t1.Enqueue\n"); 
      printf("\t2.Dequeue\n"); 
      printf("\t3.Display\n"); 
      printf("\t4.Exit\n"); 
      printf("\tEnter the desired choice:"); 
      scanf("%d",&choice); 
      switch(choice) 
      { 
       case 0: 
        q = createQueue(); 
        break; 
       case 1: 
        printf("\tEnter the data:"); 
        scanf("%d",&input); 
        enqueue(q,input); 
        break; 
       case 2: 
        printf("%d",dequeue(q)); 
        break; 
       case 3: 
        display(q); 
        break; 
       case 4: 
        exit(0); 
       default: 
        printf("\tThe value is invalid!"); 
      } 
     } 

    } 

    int main() 
    { 
     menu(); 
     return 0; 
    } 

回答

3

你写

q->rear->next = temp; 

rearqueue结构,而不是一个node结构。

你写这样的:

struct queue 
{ 
    struct queue *front; 
    struct queue *rear; 
}; 

但是从条款你用我认为应该是这样的:

struct queue 
{ 
    struct node *front; 
    struct node *rear; 
}; 

(当然,误差线将成为确定的,但你可能有其他周围的问题:))

+0

谢谢你的解决方案。虽然这是一个愚蠢的错误,很尴尬!但是,你能告诉我你刚才提到的其他错误! – nile

2

答案是在你面前。

您正在使用前面和后面定义队列结构,并且其中没有名为next的成员。

你可能已经使用队列类型的指针与成员next这是struct node的成员,而不是struct queue

这里的错误

q->rear->next = temp; 
1

这是怎么了,我会重新编写代码(见注波纹管)

#include<stdio.h> 
#include<stdlib.h> 
#define EMPTY 1 
// No need for struct node at all! 
struct queue 
{ 
    int data; 
    struct queue *front; 
    struct queue *rear; 
}; 

struct queue* createQueue(); 
void enqueue(struct queue *q,int info); 
int dequeue(struct queue *q); 
void display(struct queue *q); 
int isEmpty(struct queue *q); 
void menu(); 

struct queue* createQueue() 
{ 
    struct queue *new_queue; 
    new_queue = (struct queue *) malloc(sizeof(struct queue)); 
    if(new_queue != NULL) 
    { 
     return NULL; 
    } 
    new_queue->front = new_queue->rear = NULL; 
    return new_queue; 
} 
int isEmpty(struct queue *q) 
{ 
    if(q == NULL|| q->front == NULL) //`q` might be NULL also, so that q->front won't cause segmentation fault. 
     return EMPTY; //check the #define above. 
} 

void enqueue(struct queue *q,int info) 
{ 
    if (q == NULL) return; /*ALWAYS check for null pointer before dereference*/ 
    struct queue *temp,*temp1; // changed node to queue 
    temp = (struct queue*) malloc(sizeof(*temp)); 
    if(temp == NULL) return ; 
    temp->data = info; 
    temp->front = NULL; //changed `next' to `front', check if this is OK. 
    if(q->front == NULL && q->rear == NULL) 
    { 
     q->front = temp; 
     q->rear = temp; 
    } 
    if(q->rear != NULL) 
    {    
     q->rear->front = temp; //changed `next' to `front', check if this is OK. 
     q->rear = temp; 
    } 
} 

int dequeue(struct queue *q) 
{ 
    if(isEmpty(q) == EMPTY) 
    { 
     printf("Empty list!"); 
    } 
    struct queue *temp = q->front; //changed node to queue 
    q->front = temp->front;//changed `next' to `front', check if this is OK. 
    int data = temp->data; 
    free(temp); 
    return (data); 
} 

void display(struct queue *q) 
{ 
    if (!q) return; 
    struct queue *start,*end = NULL; //changed node to queue 
    start = q->front; 
    end = q->rear; 
    if(isEmpty(q) == 1) 
    { 
     printf("Empty List!"); 
    } 
    while(start != NULL) 
    { 
     printf("%d",start->data); 
     start = start->front;//changed `next' to `front', check if this is OK. 
    } 
} 

void menu() 
{ 
    int choice = 0; 
    int input = 0; 
    struct queue *q; 
    while(1) 
    { 
     printf("\t\tMain Menu\n"); 
     printf("\t0.Create Queue\n"); 
     printf("\t1.Enqueue\n"); 
     printf("\t2.Dequeue\n"); 
     printf("\t3.Display\n"); 
     printf("\t4.Exit\n"); 
     printf("\tEnter the desired choice:"); 
     scanf("%d",&choice); 
     switch(choice) 
     { 
      case 0: 
       q = createQueue(); 
       break; 
      case 1: 
       printf("\tEnter the data:"); 
       scanf("%d",&input); 
       enqueue(q,input); 
       break; 
      case 2: 
       printf("%d",dequeue(q)); 
       break; 
      case 3: 
       display(q); 
       break; 
      case 4: 
       exit(0); 
      default: 
       printf("\tThe value is invalid!"); 
     } 
    } 

} 

int main() 
{ 
    menu(); 
    return 0; 
} 

NOTES

  • 加场data在结构queue
  • 你不检查,如果是NULL或不被取消引用q!这可能会导致您segmentation fault
  • 代码中根本不需要struct node!想想吧
+0

不错的建议。我会为咨询方法(检查空白,显示)添加一些'const queue *'来告诉用户对象没有被通话修改。 –