我正在尝试创建循环链表,并且我正在加载一些错误。 当我试图从Node内部访问Employee结构时,看起来错误正在讨论derefencing指针。
这是我得到的错误:
magic.c: In function ‘buildList’:
magic.c:49:2: error: dereferencing pointer to incomplete type
n->e.id = 1;
^
magic.c:53:4: error: dereferencing pointer to incomplete type
n->e = e;
^
magic.c:54:4: error: dereferencing pointer to incomplete type
n->d = d;
^
magic.c:55:8: error: dereferencing pointer to incomplete type
n = n->next = (ptr)malloc(sizeof(node));
^
magic.c:58:3: error: dereferencing pointer to incomplete type
n->next = head;
^
magic.c:58:12: error: ‘head’ undeclared (first use in this function)
n->next = head;
^
magic.c:58:12: note: each undeclared identifier is reported only once for each function it appears in
magic.c: In function ‘printList’:
magic.c:68:17: error: dereferencing pointer to incomplete type
printf("%d", n->e.id);
^
magic.c:69:8: error: dereferencing pointer to incomplete type
n = n->next;
^
make: *** [magic.o] Error 1
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int uint;
typedef struct {
uint id;
uint years;
uint divion_id;
} employee;
typedef struct {
uint id;
char name[52];
char manager_name[52];
char telephone[16];
} division;
typedef struct node* ptr;
typedef struct {
employee e;
division d;
ptr next;
} node;
typedef struct {
ptr head;
} list;
list* buildList()
{
list *newList;
uint i;
employee e;
division d;
ptr n;
e.id = 1;
e.years = 5;
e.divion_id = 1;
newList = (list*)malloc(sizeof(list));
newList->head = (ptr)malloc(sizeof(node));
n = newList->head;
for (i = 0; i < 5; ++i) {
e.id = i+1;
n->e = e;
n->d = d;
n = n->next = (ptr)malloc(sizeof(node));
}
n->next = head;
return newList;
}
void printList(list *lst)
{
ptr n = lst->head;
do {
printf("%d", n->e.id);
n = n->next;
} while (n != lst->head);
}
int main()
{
list* lst;
lst = buildList();
printList(lst);
return 0;
}
答案 0 :(得分:5)
在typedef
的{{1}}您使用结构 ptr
,但您没有结构,只是一个类型别名(node
)。
例如。
typedef
答案 1 :(得分:0)
我认为错误的第一件事是你宣布; typedef struct node * ptr;在声明什么是节点之前,所以你必须编写typedef struct node * ptr;节点声明后..; 不是之前。
答案 2 :(得分:0)
我认为这里的问题是你有某种“不完整类型”的死锁情况
如果我们删除了ptr
结构中的node
成员,请执行以下操作:
typedef struct node* ptr;
typedef struct {
employee e;
division d;
} node;
然后一切都会好起来的。是的,ptr
确实指向不完整类型struct node
,但struct node
定义稍后完成它。
问题是我们有这个:
typedef struct node* ptr;
typedef struct {
employee e;
division d;
ptr next;
} node;
ptr
指向不完整类型struct node
但是当我们稍后定义struct node
时,我们发现struct node
本身不完整,因为它包含不完整类型的成员{{1所以它无法完成ptr
。