队列实现抛出不兼容的指针类型错误

时间:2018-10-06 17:19:24

标签: pointers struct queue

我认为我缺少有关结构和指针的一般概念。因此,下面的代码会产生2条警告/错误,我不明白为什么。

  1. 为什么“ queue-> head = temp”会产生以下警告: 警告:来自不兼容指针类型的分配[默认启用]

  2. 为什么“ queue-> tail-> next = temp”会产生以下错误: 错误:取消引用不完整类型的指针。

注意:“节点* temp = newNode(data)”行不会引发任何错误/警告,因此成功。

typedef struct {
  int data;
  struct Node *next;
} Node;

typedef struct {
  struct Node *head;
  struct Node *tail;
} Queue;

void enQueue(Queue *queue, int data) 
{ 
    // Create a new node
    Node *temp = newNode(data); 


    // If queue is empty, then new node is both head and tail 
    if (queue->tail == NULL) 
    { 
       queue->head = temp;
       queue->tail = temp; 
       return; 
    } 

    // Add the new node at the end of queue and change tail 
    queue->tail->next = temp; 
    queue->tail = temp;
}

1 个答案:

答案 0 :(得分:0)

如何获取此代码进行编译? 您的Node结构包含一个指向另一个Node的指针。用您声明结构的方式,编译器在解析结构定义时不知道Node。因此,您必须编写:

1 typedef struct Node{
2   int data;
3   struct Node *next;
4 } Node;

通过这种方式,编译器知道在解析结构时如何处理它。在第3行中,它已经知道Node是结构。由于您的某些代码丢失,因此我创建了一个实现超简单队列的最小示例:

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


#define MAX 5
typedef struct Node{
  int data;
  struct Node *next;
} Node;

typedef struct {
  struct Node *head;
  struct Node *tail;
} Queue;

Node* newNode(const int nodeData){
    Node* tmp = malloc(sizeof(*tmp));
    if (NULL == tmp){
        printf("Could not allocate Node ... exiting");
        exit(EXIT_FAILURE);
    }
    tmp->data = nodeData;
    tmp->next = NULL;
    return tmp;


}
void enQueue(Queue *queue, int data) 
{ 
    // Create a new node
    Node *temp = newNode(data); 


    // If queue is empty, then new node is both head and tail 
    if (queue->tail == NULL) 
    { 
        printf("Queue is empty\n");
       queue->head = temp;
       queue->tail = temp; 
       return; 
    } 

    // Add the new node at the end of queue and change tail 
    queue->tail->next = temp; 
    queue->tail = temp;
}

void printQueue(Queue* q){
    Node* tmp = q->head;
    while (tmp != NULL){
        printf("Value: %d\n", tmp->data);
        tmp = tmp->next;
    }
}

int main(void){
    Queue q;
    q.head = q.tail = NULL;
    int i;

    for (i = 0; i < MAX; ++i){
        printf("%d is entered into the queue\n", i);
        enQueue(&q, i);
    }
    printQueue(&q);
}