[英]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.