' struct queue'没有名为' next'的成员。

时间:2016-08-27 07:12:27

标签: c data-structures queue

我尝试使用链接列表使用以下结构实现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;
    }

3 个答案:

答案 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
  • 代码中根本不需要struct node!想一想