次のコードを記述しましたが、create()関数を実行した後に動作を停止します。ヘッドノードから始まる代替要素を削除したい。私のdelete_Alt()関数は正しいですか?私が間違っているところを教えてください。あなたのプログラムでCの二重リンクリストの代替ノードを削除するにはどうすればよいですか?
#include <stdio.h>
#include <stdlib.h>
// using a structure
typedef struct mynode {
int data;
struct mynode *prev; // to point to previous node
struct mynode *link; // to point to next node
} node;
node *head = NULL;
// creating the list
void create() {
node *p, *q;
int ch;
do {
p = (node *)malloc(sizeof(node));
printf("enter data\n");
scanf("%d", &p->data);
if (head == NULL)
{
p->prev = head;
q = p;
}
else
{
p->prev = q;
p->link = NULL;
q->link = p;
q = p;
}
printf("create another node?, press 1 ");
scanf ("%d",&ch);
} while(ch==1);
}
//to delete alternate elements
void delete_Alt() {
if (head == NULL)
printf("Empty list...ERROR");
node *previous, *current, *next;
previous = head;
current = head->link;
while (previous !=NULL && current != NULL) {
previous->prev = current->prev;
previous->link = current->link;
next = current->link;
previous->link = next;
next->prev = previous;
free(current);
}
}
// print the list
void display() {
node *temp;
temp = head;
while (temp != NULL) {
printf("%d ",temp->data);
temp = temp->link;
}
printf("\n");
}
int main() {
node *head = NULL;
create();
printf("List before deleting is: ");
display();
delete_Alt();
printf("List after deleting is: ");
display();
return 0;
}
あなたの 'while'ループの生涯で' current'(それに含まれるアドレス)の値を考えてみましょう。ループの前に* once *を設定します。それは決して再び変更されることはありませんが、逆参照され、自由に繰り返されます。それは*おそらく*正しいことはできません。 'head'で指し示された最初のノードが解放された最初のノードである場合、なぜ' head'に保持されているアドレスが決して変更されないのかということは非常に疑わしいです。 *予想される入出力サンプルは、この質問を行うでしょう、btw。 – WhozCraig