链表创建中的分段错误

时间:2015-08-01 06:27:45

标签: c

我写了以下程序来创建一个单链表。然而,它在第28行给出了分段错误:ptr-> info = x;在输入链表的第一个节点后,程序将在此处终止。

#include<stdio.h>
#include<stdlib.h>

int main(void)
{

struct node
{
    int info;
    struct node *link;
};

struct node *ptr,*start,*prev;
int n,x,i;

printf("enter the number of linked list elements\n");
scanf("%d",&n);
ptr=malloc(n*sizeof(struct node));
prev=malloc(n*sizeof(struct node));
start=malloc(n*sizeof(struct node));
ptr=NULL;
start=NULL;
prev=NULL;
for(i=0;i<n;i++)
{
    printf("enter the element\n");
    scanf("%d\n",&x);
    ptr->info =x;
    ptr->link =NULL;
    if(start==NULL)
    {
        prev=ptr;
        start=ptr;
    }
    else
    {
        prev->link = ptr;
        prev=ptr;
    }
}

ptr = start;
while(ptr != NULL)
{
    printf("%d ",ptr->info);
    ptr = ptr->link;
}
return 0;
}

代码中有什么问题?

3 个答案:

答案 0 :(得分:1)

我猜你对实施感到困惑。为什么要声明* ptr的大小为

    n * sizeof(struct node)

如果n是否。 LL中的元素,将循环中的每个元素声明为:

    struct node *temp = (struct node*)malloc(sizeof(struct node));

然后初始化。

答案 1 :(得分:1)

ptr=malloc(n*sizeof(struct node));

这应该在for循环中 -

for(i=0;i<n;i++){
    //your code
 }

因为每次添加新节点时都必须分配内存来创建一个节点。

我还建议您从

中删除'\n'
scanf("%d\n",&x);
          ^Remove this.

因为它会使你的下一个scanf在迭代中被跳过。

答案 2 :(得分:0)

以下一段代码存在问题:

ptr=malloc(n*sizeof(struct node));
prev=malloc(n*sizeof(struct node));
start=malloc(n*sizeof(struct node));
ptr=NULL;
start=NULL;
prev=NULL;

底线你分配内存3次,当你这样做时,你保留一个指向刚刚分配的内存的指针 但是,您已经将该指针指定为NULL,因此您创建了内存泄漏,因为您分配的内存不再可供您访问。

您最常在循环中为一个项目分配一块内存,在每次迭代期间为一个项目,并将其放入双链表中。你首先将辅助指针初始化为NULL这一事实是一件好事。但是,在分配内存之后进行初始化这一事实表明你并不完全理解所有那些好的指针。