PTA関数の最後の質問:リンクリストからノードを削除する

コードのリンクリストからノードを削除します
(最初に記述したときは、入力するのが少し面倒
です)。
#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つのケースで条件が異なることがわかりました。
それがお役に立てば幸いです。

おすすめ

転載: blog.csdn.net/weixin_51235620/article/details/111385823