C中的单链表

时间:2011-06-30 06:22:11

标签: c

这是我在StackOverFlow上的第一篇文章。 我正在研究linklist - 下面是我的代码。 我只是添加一个节点来列出并打印它 - 我正在做的是传递指向“addTermNode”函数的指针,然后将这个传递指针指向新创建的节点。

#include<stdio.h>
#include<time.h>


typedef struct _termination_code_ {
  int terminationCode;
  unsigned long time;
  struct _termination_code_ *next;
}termination_code;

int addTermCode(termination_code *infoTerm, int termCode, unsigned long timerInfo)
{
        termination_code *node;
        node=(termination_code*)malloc(sizeof(termination_code));
        if(NULL == node) return -1;
        node->terminationCode=termCode;
        node->time=timerInfo; 
        node->next=NULL;
        infoTerm = node;
        return 0;
}

int main ()
{
        termination_code *list2=NULL;
        //Add A single node and print it. 
        if(addTermCode(list2, 12, time(0))==0)
                printf("All OK node added\n");
        else 
                printf("something went wrong\n");

        printf("Entered info :%d %ld\n",list2->terminationCode,list2->time);
}

这是我得到的输出 - 不知道为什么。请帮助。

[zahmed@build3 rnd]$ ./a.out 
All OK node added
Segmentation fault
[zahmed@build3 rnd]$ 

由于

2 个答案:

答案 0 :(得分:2)

在addTermCode中,您正在更改infoTerm变量的值。该值是一个指针,但您只是更改本地值(C仅为按值传递)。要在函数外部更改指针,您应该将指针传递给指针......类似于termination_code ** infoTerm,并且更改* infoTerm =&amp; node。

而且,要清楚,分段错误是因为您正在访问外部指针,该外部指针尚未更改并仍指向错误的地址。

答案 1 :(得分:0)

问题在于您传回新对象的方式。将新对象分配给指针将不会像您编写的那样工作。您应该从addTermCode()函数返回对象。

基本上你的list2指针仍为null。从该函数返回新创建的对象并将其分配给list2。

如果没有,您需要调整代码,以便正确分配指针。

int addTermCode(termination_code **infoTerm, int termCode, unsigned long timerInfo)
{
     ....
     *infoTerm = node;
}

int main ()
{
    termination_code *list2=NULL;
    //Add A single node and print it.
    if(addTermCode(&list2, 12, time(0))==0)
       printf("All OK node added\n");
    printf("Entered info :%d %ld\n",list2->terminationCode,list2->time);
}