按头和节点制作链表

时间:2015-02-10 03:11:30

标签: c

这里是我用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;
}

3 个答案:

答案 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);
/* ... */
}