我尝试使用链接列表使用以下结构实现Queue。但是在enqueue函数中,正好在注释下面我得到了上面提到的错误。这个错误发生了,而在此链接http://quiz.geeksforgeeks.org/queue-set-2-linked-list-implementation/给出的代码中使用了相同的错误。我用它来运行代码。但我不明白为什么我得到这个错误。请帮忙!
#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;
}
答案 0 :(得分:3)
error: a value named `_IGNORE` has already been defined in this block
q->rear->next = temp;
是rear
结构,而不是queue
结构。
你写了这个:
node
但是从您使用的术语来看,我认为它应该是这样的:
struct queue
{
struct queue *front;
struct queue *rear;
};
(当然错误行会变好,但你可能还有其他问题:))
答案 1 :(得分:2)
答案就在你面前。
您正在定义前后队列结构,并且其中没有名为next
的成员。
你可能已经使用了成员next
的队列类型指针,该成员是struct node
的成员,而不是struct queue
这是错误
q->rear->next = temp;
答案 2 :(得分: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;
}
注意
data
queue
q
而不检查它是否为NULL
!这可能会导致您segmentation fault
。node
!想一想