コードのリンクリストからノードを削除します
(最初に記述したときは、入力するのが少し面倒
です)。
#include <stdio.h>
#include <stdlib.h>
struct ListNode {//リンクリストの
intデータを定義します;
struct ListNode * next;
};
struct ListNode * readlist();
struct ListNode * deletem(struct ListNode * L、int m);
void printlist(struct ListNode * L)//輸出出
{ struct ListNode * p = L; while§{ printf( "%d"、p-> data); p = p-> next; } printf( "\ n"); }
int main()
{ int m; struct ListNode * L = readlist(); scanf( "%d"、&m); L = deletem(L、m); printlist(L);
return 0;
}
struct ListNode * readlist()
{ struct ListNode * head、* tail、* p; head = tail = NULL; // headは初期値を判断するために空であり、(1){ p =(struct ListNode *)malloc(sizeof(struct ListNode)); scanf( "%d"、&(p-> data));
if (p->data < 0)//输入小于零时结束
break;
p->next = NULL;//由于链表顺序与插入顺序相同,故每读入一项都要使下一项指向空
if (head == NULL)//对链表赋初值(头节点)
head = p;
else tail->next = p;//将链表读入
tail = p;//尾指针后移
}
return head;
}
struct ListNode * deletem(struct ListNode * L、int m)
{ struct ListNode * p、* q; // pは削除される前のノード、qは削除されるノードwhile(L!= NULL && L- > data == m)//リンクリストが空でない場合、リンクリストのヘッドノードが削除する要素であるかどうかを判断します{ q = L; L = L-> next; free(q); } if (L == NULL)//リンクリストが空かどうかを判断します{ return NULL; }
//删除头结点后指定的结点
p = L; //p为要删除结点的前一结点
q = L->next; //q为要删除的结点
while (q != NULL) //遍历头结点后的结点
{
if (q->data == m)//找到指定结点,删除该结点后,q指针指向删除结点的后一结点,p不变
{
p->next = q->next;
free(q);
q = p->next;
}
else //未找到该节点,p,q指针均向后移一个结点
{
p = q;
q = q->next;
}
}
return L;
}私は
もともとforループを使用してそのステップを判断しましたが、後で2つのケースで条件が異なることがわかりました。
それがお役に立てば幸いです。