这里是我用C制作链表的代码。它在while循环执行一次后给出运行时错误。 Plz帮助我纠正我的代码。 (完全混淆了错误的位置。)我先创建一个头节点,然后再添加子节点。
#include <stdio.h>
#include <stdlib.h>
typedef struct node nd;
typedef nd *link;
struct node{
int data;
link next;
};
typedef struct {
int size;
link head;
}list;
void create(link temp)
{
link new;
new=(link)malloc(sizeof(nd));
printf("enter data: ");
scanf("%d",new->data);
temp->next=new;
temp=temp->next;
}
list createlist()
{
list sl;
sl.size=0;
sl.head=0;
return sl;
}
int main()
{
list sl;
sl=createlist();
link temp;
temp=sl.head;
char c;
while (1)
{
printf("Add node?: ");
scanf(" %c",&c);
if (c=='y')
{
create(temp);
sl.size++;
}
else
break;
}
return 0;
}
答案 0 :(得分:2)
你的createlist()
函数返回对返回后超出范围的局部变量的引用。您应该返回基于堆的值:
list* createlist() {
list* sl = (list*)malloc(sizeof(list));
sl->size=0;
sl->head=0;
return sl;
}
答案 1 :(得分:0)
最初临时指向NULL。 temp = sl.head;
在create(temp)temp-&gt; next = new;
您正在取消引用NULL,地址0x0。我这样做时会出现分段错误。
需要更改算法。 调试器会立即显示此问题。
答案 2 :(得分:0)
您可以使用指向temp的指针。如果你没有将typedef用于指向节点的指针,那么读起来会更容易。我还没有测试过这个,但它应该很接近:
nd ** create(nd **temp)
{
nd *new;
new=(nd *)malloc(sizeof(nd)); /* this cast shouldn't be needed */
printf("enter data: ");
scanf("%d",&(new->data));
new->next = NULL;
*temp = new;
return &(new->next);
}
/* ... */
int main()
{
nd **temp;
temp = &(sl.head);
/* ... */
temp = create(temp);
/* ... */
}