#include <stdio.h>
typedef int element_type;
typedef struct Cell{
element_type e;
struct Cell *next;
} Cell,*List;
Cell *End(List L){
Cell *q = L;
while (q->next != NULL){
q = q->next;
}
return q;
}
void Insert(Cell *p, element_type x){
//Create new Cell
Cell *temp = (Cell*) malloc(sizeof(Cell));
if (temp == NULL){
printf("Memory Allocation Failed");
}
else{
temp->e = x;
temp->next = p->next;
p->next = temp;
}
}
element_type Retrieve(Cell *p){
return p->e;
}
int main(){
//Initialize the List;
List L = malloc(sizeof(Cell));
L->e = NULL;
L->next = NULL;
element_type x = 10;
Insert(L,x);
printf("Just retrievd the item %d\n",Retrieve(L));
return 1;
}
List_pointer.c: In function ‘Insert’:
List_pointer.c:19:24: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
List_pointer.c: In function ‘main’:
List_pointer.c:35:12: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
List_pointer.c:36:8: warning: assignment makes integer from pointer without a cast [enabled by default]
感谢您的所有帮助,我现在支持struct的部分。但是,当我尝试使用malloc时,我在不兼容的声明中再次收到警告。我以为malloc返回一个指向NULL的泛型指针,因此不应该有任何转换问题吗?我不知道我在这里做错了什么。
对于那些想知道为什么我会实现这样一个奇怪的界面的人,我正在遵循本书提供的接口&#34;数据结构和算法&#34;由Aho。示例代码以Pascal提供,非常古老的风格。虽然我认为学习这种超老式的数据结构设计方法有一些优点。
更新
我忘了为malloc包含stdlib.h标头! 请参阅此链接incompatible implicit declaration of built-in function ‘malloc’
答案 0 :(得分:3)
您需要更改
typedef struct {
到
typedef struct Cell {
typedef struct { /* ... */ } Cell;
定义了无标记结构。实际上,struct本身没有名称可以通过它直接引用它。名称Cell
只是引用此未命名结构的typedef
的名称。
当您使用struct Cell
声明next
时,它表示“名为Cell
的结构”。但是,没有名为Cell
的结构,因为您定义的结构没有名称。
通过命名结构(给它一个标记),您可以使用struct Cell
表示法来引用它。
答案 1 :(得分:2)
您需要为struct
提供标记,而不仅仅是typedef:
typedef struct Cell {
element_type e;
struct Cell *next;
} Cell,*List;
如果没有标记,struct Cell *
未定义,导致错误。
理解这个typedef的解剖结构非常有用:它是两个声明的组合:
struct Cell {
element_type e;
struct Cell *next;
};
和
typedef struct Cell Cell;
如果没有标记,则typedef
- 无标记struct
。