我尝试了这个代码,但我得到了一个分割错误。如何修复此错误?
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
是指针。起初,两者都指向起点。然后,通过使用两个循环,我交换了第一个和最后一个节点的值,然后交换了第二个和第二个最后一个节点的值,等等。
把你的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 -> data = temp时,没有意义
程序崩溃并给出分段错误
您有一个差一的错误。计算列表中的count
元素,然后在i
上for
列表的第一次迭代时,将列表中的p
到count - 0
链接步进。这使得它为NULL,正如您刚刚完成的确定。当你计算p->data
时,你会产生未定义的行为。
从1到count / 2
执行i
,而不是从0
到count / 2 - 1
。