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)
。我很努力地弄清楚问题是什么,但不能。
答案 0 :(得分: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
上传了(hackish)版本的解决方案
答案 1 :(得分:1)
对于第二个添加,h-&gt; next_number为NULL,因此在内部while循环的第一次迭代中,您取消引用NULL(h-&gt; next_number-&gt;数字的别名)。
修改强>
当你插入第二个项目时:
head == tail,so head-&gt; next == NULL。
你开始内循环:
head-&gt; number ==第一个插入的项目。
head-&gt; next == NULL。
head-&gt; next-&gt; number == dereferenced NULL。