任何人都可以识别我的代码中发生的导致分段错误的内容吗?请修改/更正错误的部分。
void InsertAtMid (Node *head){
int num,count=0,i;
Node *ptr=head;
Node *newnode=NULL;
Node *newnode2=head;
printf("Enter node to be inserted: ");
scanf("%d", &num);
if (head==NULL){
newnode = head;
newnode=(Node *)malloc(sizeof(Node));
newnode->x=num;
newnode->next=NULL;
newnode->prev=NULL;
} else {
ptr=head->next;
while(ptr->x!=(count/2)){
ptr=ptr->next;
}
newnode->next=ptr->next;
newnode->prev=ptr;
ptr->next->prev=newnode;
ptr->next=newnode;
}
}
答案 0 :(得分:1)
因此,基于我对您的代码的理解 - 以下应该[主要]工作:
void InsertAtMid (Node **head){
int num = 0;
int count = 0
int advance = 0;
Node *ptr = *head;
Node *newnode = NULL;
printf("Enter node to be inserted: ");
scanf("%d", &num);
if (*head == NULL) {
*head = (Node *)malloc(sizeof(Node));
ptr = *head;
ptr->x = num;
ptr->next = NULL;
ptr->prev = NULL;
} else {
// *** Count the number of items
ptr = *head;
while (ptr != NULL) {
ptr = ptr->next;
count++;
}
// *** Move to the middle of the list
ptr = *head;
while (advance < (count/2)){
ptr = ptr->next;
advance++;
}
// *** Insert the new value
newnode = (Node *)malloc(sizeof(Node));
newnode->x = num;
newnode->next = ptr->next;
newnode->prev = ptr;
ptr->next->prev = newnode;
ptr->next = newnode;
}
}
以下是我修复的问题:
希望有所帮助。祝你好运!
答案 1 :(得分:0)
int num,count=0,i;
...
ptr=head->next;
while(ptr->x!=(count/2)){
ptr=ptr->next;
count初始化为0且永不改变。
因此,除非你为x输入“0”,否则每次循环都只是走出列表的末尾。
答案 2 :(得分:0)
测试在什么情况下你的代码段错误。
你会发现它在head == NULL
时可以正常工作,但如果head
不为空则会失败。
所以你知道你的错误在else
块中。
在调试器中逐步运行您正在运行的代码(如果您不知道怎么做,那么学习永远不会太早:每当您使用调试器解决问题时,您都会想到“为什么我不早点转向这个?” )。
计算出您期望发生的事情,观察调试器中的变量,以及当实际值偏离您的期望时,请说明原因。
我不清楚您在代码中发生了什么期望,但对于包含一个节点的列表实际发生的情况是:
ptr=head->next;
- 所以ptr
现在是NULL
。while
条件,它会尝试取消引用ptr->x
,并且由于ptr
为NULL,因此会出现段错误。快速解决这个问题的方法是:
while(ptr != NULL && ptr->x ....) {
但你需要考虑这是否是你想要的实际逻辑;一旦你超越了它,你就会遇到其他问题(例如,count
永远不会改变),这可以用调试器以相同的方式进行整理。