0
                if(tmpPtr->number<tmpPtr->next_number->number)
                {
                    int tmpV1=tmpPtr->next_number->number;
                    int tmpV2=tmpPtr->number;
                    tmpPtr->next_number->number=tmpV2;
                    tmpV2=tmpPtr->number=tmpV1;
                }

这是我到目前为止所尝试的,这应该是对链表进行排序,因为每次都添加成员。但是当我尝试放入第二个节点时编译器崩溃。断点是 if 语句if(tmpPtr->number<tmpPtr->next_number->number)。我真的很努力地想弄清楚问题是什么,但不能。

4

2 回答 2

2

您的问题是,在第二次运行时tmpPtr指向您的第一个元素,其next_number值为NULL. 因此,一旦您尝试取消引用它,它基本上会将自身缩减为NULL指向SIGSEGV.

第一次运行后

n->number = input
n->next_number = NULL
h = n
t = n
counter2 = 1

所以从第二个输入开始

n->number
n->next_number = NULL
tmpPtr = h // which is the previous n and therefor h->next_number = NULL
tmpPtr->next_number == NULL // this is your problem since you do not check if next_number is a valid pointer

更新:如果在https://gist.github.com/sahne/c36e835e7c7dbb855076上传解决方案的(hackish)版本

于 2013-03-12T23:25:26.313 回答
1

对于第二次添加,h->next_number 为 NULL,因此在内部 while 循环的第一次迭代中,您取消引用 NULL(h->next_number->number 的别名)。

编辑
当您插入第二个项目时:
head == tail,所以 head->next == NULL。
您开始内部循环:
head->number == 第一个插入的项目。
头->下一个 == NULL。
head->next->number == 取消引用 NULL。

于 2013-03-12T23:25:43.153 回答