6-3シングルチェーンテーブルノード削除(20点)

11434 ワード

この問題では、読み込んだデータを単一のチェーンテーブルに格納し、チェーンテーブルに所定の値が格納されているすべてのノードを削除する2つの関数を実現する必要があります.チェーンテーブルノードの定義は次のとおりです.
struct ListNode { int data; ListNode *next; };
関数インタフェースの定義:
struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m );
関数readlistは、標準入力から一連の正の整数を読み込み、読み込み順に単一チェーンテーブルを作成します.−1を読むと入力が終了することを示し,関数は単一チェーンヘッダノードを指すポインタを返す.
関数deletemは、単一チェーンテーブルLにmが格納されているすべてのノードを削除します.結果チェーンヘッダノードを指すポインタを返します.審判試験プログラムのサンプル:
#include 
#include 

struct ListNode {
     
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
void printlist( struct ListNode *L )
{
     
     struct ListNode *p = L;
     while (p) {
     
           printf("%d ", p->data);
           p = p->next;
     }
     printf("
"
); } int main() { int m; struct ListNode *L = readlist(); scanf("%d", &m); L = deletem(L, m); printlist(L); return 0; }

/*あなたのコードはここに埋め込まれます*/
サンプルを入力:
10 11 10 12 10 -1 10
出力サンプル:
11 12
struct ListNode *readlist(){
     
    struct ListNode *p,*head,*tail;
    head=NULL;
    int score;
    while(1){
     
    p=(struct ListNode *)malloc(sizeof(struct ListNode ));
    scanf("%d",&score);
    if(score==-1)
    break;
    p->data=score;
    p->next=NULL;
    if(head==NULL)
    head=p;
    else
    tail->next=p;
    tail=p;

    }
    return head;
}
struct ListNode *deletem( struct ListNode *head, int min ){
     
    struct ListNode * p1,* p2;
    while(head!=NULL&&head->data==min){
     
        p2=head;
    head=head->next;
    free(p2);
    }
    if(head==NULL)
    return NULL;
    p1=head;
    p2=head->next;
    while(p2!=NULL){
     
        if(p2->data==min){
     
            p1->next=p2->next;
            free(p2);
        }
        else
        p1=p2;
        p2=p1->next;
    }
    return head;
}