添加节点后,链表仍然为空?

时间:2011-09-18 05:10:53

标签: c gcc

thanx k-ballo,你解决了我的prevoius问题,但后来我降落到另一个! 我创建了节点,然后尝试显示它们,但每次我调用append_node()时,双指针**head_ptr(用于保存第一个指针*head的地址,而后者,保存链表的第一个节点的地址),保持NULL值,好像之前对append_node(&head, value)的调用没有向*head添加任何节点。 所以每当我显示列表时,它都是空的!! :

#include <stdio.h>

struct __node
{   int data;
    struct __node *next;
};

typedef struct __node node;

int append_node(node **head_ptr, int value)  //double pointer head_ptr to simulate call-by-reference
{   node *temp, *q;

    temp = (node *) malloc(sizeof(node));
    if(!temp)
    {   printf("\ninsufficient memory!!");
        return -1;
    }

    q = *head_ptr; //as *head_ptr is address of a pointer (which is *head), so any changes made after this line in q should also be reflected in main().. (i guess so!)

    temp->data = value;
    temp->next = NULL;

    if(q == NULL)
    {    q = temp;
         printf("\nq is empty");
         return 0;
    }

    while( q->next != NULL)
    {   q = q->next;
    }

    printf("\nq is not empty");
    q->next = temp;

    return 0;
}

int disp_list(node **head_ptr)
{   node *q;
    int i=1;

    q = *head_ptr;
    if(q != NULL)
    {   while( q != NULL )
        {   printf("|%d-%d|--->", i++, q->data);
            q = q->next;
        }
    }
    else
    {   printf("\nlist is empty!!");
    }

    return 0;
}

int main()
{   node *head=NULL;
    int value, res, i=0;

    while(i<3)
    {   printf("\nenter the data to be inserted into the node: ");
        scanf("%d", &value);
        res = append_node( &head, value);
            i++;    
    }

    printf("\nprinting all the nodes...\n") ;
    res = disp_list(&head);
    printf("\n---------------\nexiting...\n\n\n");  
    return 0;
}

我知道我可以从append_node()返回* q并将其重新分配给* head或声明* head为全局..但我想*头部被所谓的pass-by-reference方法操纵。 (实际上在c中没有传递引用!)我的编译器是:gcc版本4.5.2(Ubuntu / Linaro 4.5.2-8ubuntu4)

PLZ help..i我不是专家所以请使用更简单的术语!! :P

2 个答案:

答案 0 :(得分:2)

你对append_node的初始调用是传递一个指针指向未初始化的节点的指针(让我们按下它的null,尽管它可能只是垃圾)。然后你做

q = *head_ptr;
//above statement causes a segment fault error..
// that statement should be fine, we will get the value of main's head, which we pressume to be null

// now we will try to dereference null by accesing its next element
while( q->next != NULL)
{   q = q->next;
}

答案 1 :(得分:0)

此计划存在两个主要问题:

  1. head未初始化且包含垃圾。
  2. 您不会处理append_node()中的空列表。
  3. 这两个问题都会导致分段错误。