链接列表程序中的分段错误

时间:2013-03-19 06:35:32

标签: c segmentation-fault

此程序在第一个printf语句后导致分段错误。 据我所知,如果出现分段错误,内存堆栈就会满了。但在我的情况下,只有在调用程序4次之后才会有递归程序。

请帮助我理解为什么会这样。

以下是代码:

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

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

void append(struct node **, int);
void addatbeg(struct node **,int);
int count(struct node *);
void display(struct node *);
void addafter(struct node **, int,int);

int main()
{
    struct node *q;
    q= NULL; //list is empty

    append(&q,10);
    append(&q,20);
    append(&q,30);
    append(&q,40);

    printf("Now display the contents of the linked list:\n");
    display(q);

    addatbeg(&q,17);
    addatbeg(&q,59);

    printf("after adding the elements in the beginning, new linked list contents are\n");

    display(q);

    addafter(&q,4, 15);
    addafter(&q,7, 25);
    printf("after adding the elements at specified location, list elements are:    \n");
    display(q);

    printf("\n\nCounting of list elements, list has %d elements", count(q));
    return 0;
}

void append(struct node **p, int num)
{
    struct node *temp, *r;
    temp=*p;
    if(*p==NULL)
    //Linked list is empty and the node to be added is the first node
    {
        temp=(struct node *)malloc(sizeof(struct node));
        temp->data=num;
        temp->link=NULL;
        *p=temp;
    }
    else
    {
        while(temp->link!=NULL)
        {
            temp=temp->link;

            r=(struct node*)malloc(sizeof(struct node));
            r->data=num;
            r->link=NULL;
            temp->link=r;
        }
    }
} 

void addatbeg(struct node **p, int num)
{
    struct node *temp, *r;
    temp=*p;

    r=(struct node *)malloc(sizeof(struct node));
    r->data=num;
    r->link=temp->link;
    *p=r;
}

void addafter(struct node **p, int loc, int num)
{
    int i;
    struct node *temp, *r;
    temp=*p;
    //first we will find out the desired loc
    for(i=0; i<loc; i++)
        temp=temp->link;
    //now need to create a new node

    r=(struct node*)malloc(sizeof(struct node));
    r->data=num;
    r->link=temp->link;
    temp->link=r;
}

void display(struct node *p)
{
    while(p!=NULL)
    p=p->link;
    printf("\n%d\t",p->data);
}

int count(struct node *p)
{
    int count=0;
    while(p!=NULL)
    {
        p=p->link;
        count++;
    }
    return count;
}

4 个答案:

答案 0 :(得分:2)

一个问题是,在append()中,您是在循环中创建新元素,而不是只创建一个:

63    while(temp->link!=NULL)
64    {
65     temp=temp->link;

 r=(struct node*)malloc(sizeof(struct node));
68     r->data=num;
69     r->link=NULL;
70     temp->link=r;
71    }

然而,段错误的直接原因可能如下:

105 void display(struct node *p)
106 {
107   while(p!=NULL)
108   p=p->link;
109   printf("\n%d\t",p->data);
110 }

这里,printf()需要在循环内部。您当前的代码实际上并不打印元素,并尝试取消引用NULL指针。

答案 1 :(得分:0)

您的问题很可能来自您的显示功能。你可能已经忘记了括号。

要获得关于内存分配错误的一些非常好的提示,更常见的是你的内存错误,你应该使用valgrind(如果你使用的是linux发行版)。

答案 2 :(得分:0)

在此功能中

void display(struct node *p)
 {
   while(p!=NULL)
   p=p->link;
   printf("\n%d\t",p->data);
 }

当循环结束时p将为NULL。 所以你得到分段错误。

将其更改为

while(p->link!=NULL){
   ...
}

答案 3 :(得分:0)

第20-22行:

您正在将空指针的地址传递给append,从而导致未定义的行为。

可能的解决方法:

20 q = malloc(sizeof q);
   *q = NULL;

您的代码似乎还有其他问题,因此请查看其他答案和评论。