这是我为链表编写的代码。基本上,它只需要输入并打印它。在编译时,它不会给出错误,但也不会给出输出。我不明白这个代码出了什么问题?帮帮我。
#include<stdio.h>
struct list {
int data;
struct list* next;
};
insert(struct list* node, int data)
{
node = malloc(sizeof(struct list*));
if (node == NULL)
node = data;
else
node->data = data;
node->next = NULL;
return node;
}
printlist(struct list* node)
{
if (node == NULL)
printf("Empty listn");
while(node->next != NULL)
printf("the list contains %d", node->data);
node = node->next;
}
main()
{
struct list* NODE;
NODE = malloc(sizeof(struct list*));
insert(NODE, 3);
insert(NODE, 5);
printlist(NODE);
}
这是因为当你这样做时,你没有保留节点的指针,也删除了*
node=malloc(sizeof(struct list*));
试试这样的东西:
struct list * insert(struct list* node ,int data)
{
struct list * new_elem = malloc(sizeof(*new_elem)); //check !=NULL
new_elem->data = data;
new_elem->next = NULL;
if (node != NULL)
node->next = new_elem;
return (new_elem);
}
实际上,它包含了许多错误。
重写insert():
struct list* insert(struct list* node ,int data) //need the type of return value
{
struct list* newnode;
newnode=malloc(sizeof(struct list)); //get rid of '*'
//how to insert to a link list? I suggest you make it understand.
//in this code, I insert an element in the head.
newnode->data = data;
//if (node==NULL)
// newnode->next = NULL;
//else
// newnode->next=node;
//the code above equals:
newnode->next = node;
return newnode;
}
在printlist()中,您不能将一些代码制作为带有空格而不是";"的块,也就是说,更改
while(node!=NULL)
printf("the list contains %dn",node->data);
node=node->next;
至
while(node!=NULL) {
printf("the list contains %dn",node->data);
node=node->next;
}
旧的insert()中也存在同样的错误。
如果没有printlist()的返回值类型,它可以编译,但我建议添加一个,比如void
。
此外,对于空列表,您需要更改:
if (node==NULL)
printf("Empty listn");
至
if (node==NULL) {
printf("Empty listn");
return;
}
有了这个新的insert(),main()将是:
main()
{
struct list* NODE = NULL;
NODE = insert(NODE,3);
NODE = insert(NODE,5);
printlist(NODE);
}
我已经测试过,在这个修复之后,它是有效的。