我尝试了这段代码,但是我遇到了分段错误。我该如何解决这个错误?
void rev()
{
struct node *p,*q;
p=start;
q=start;
int count=0,temp,i,j;
while(p!=0)
{
p=p->next;
count++;
}
for(i=0; i<(count/2); i++)
{
p=start;
for(j=0; j<(count-i); j++)
p=p->next;
temp=q->data;
q->data=p->data;
p->data=temp;
q=q->next;
}
}
此处p
和q
是指针。起初,两者都指向开始。
然后,通过使用两个循环,我交换了第一个和最后一个节点的值,然后是第二个和第二个节点,依此类推。
答案 0 :(得分:1)
您有一个错误的错误。您计算列表中的count
个元素,然后在for
列表的i
列表的第一次迭代中,您在列表中逐步p
到count - 0
个链接。这使它成为NULL,因为你刚刚完成了确定。然后,当您评估p->data
时,会产生未定义的行为。
从1到i
而不是从count / 2
到0
运行count / 2 - 1
。
答案 1 :(得分:1)
将你的for(i=0; i<(count/2); i++)
放在纸上。
当您到达链表中的最后一个节点时,q和p都指向最后一个节点;
p = p -> next //is NULL so p goes NULL;
你的循环正在运行一次迭代。
所以将内部循环更新为count -i - 1
当您指定p -> data = temp
//哪个NULL - &gt; data = temp,毫无意义
程序崩溃并发出分段错误。