[英]doubly linked list insert at middle
谁能识别我的代码中引起分段错误的内容? 请修改/纠正错误的部分。
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;
}
}
因此,根据我对您的代码的理解-以下应该[大部分]有效:
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;
}
}
以下是我解决的问题:
希望对您有所帮助。 祝你好运!
int num,count=0,i;
...
ptr=head->next;
while(ptr->x!=(count/2)){
ptr=ptr->next;
count初始化为0,并且从未更改。
因此,除非您为x输入“ 0”,否则while循环每次都会走出列表的末尾。
测试以找出在什么情况下您的代码段错误。
您会发现,当head == NULL
时,它可以正常工作,但是如果head
不为null,则会失败。
因此,您知道您的错误在else
块中的某处。
在调试器中逐步执行正在运行的代码(如果您不知道怎么做,那么学习它永远不会太早:每当您使用调试器解决问题时,您都会想到“为什么不早点解决?”。)
弄清您期望发生的情况,观察调试器中的变量,以及当实际值偏离您的期望时,说明原因。
对我来说尚不清楚您期望在代码中发生什么,但是对于具有一个节点的列表,实际发生的是:
ptr=head->next;
-因此ptr
现在为NULL
。 while
条件,它将尝试取消对ptr->x
引用,并且由于ptr
为NULL,它将进行段错误。 一个快速的解决方法是:
while(ptr != NULL && ptr->x ....) {
但是您需要考虑这是否是您想要的实际逻辑; 而一旦您克服了这些麻烦,就会遇到其他问题(例如, count
永不改变),这些问题可以用调试器以相同的方式加以解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.