我认为我缺少有关结构和指针的一般概念。因此,下面的代码会产生2条警告/错误,我不明白为什么。
为什么“ queue-> head = temp”会产生以下警告: 警告:来自不兼容指针类型的分配[默认启用]
为什么“ 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;
}
答案 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);
}