習題11-7 奇數值結點鏈表 | 浙大版《C語言程序設計(第3版)》題目集

習題11-7 奇數值結點鏈表

本題要求實現兩個函數,分別將讀入的數據存儲爲單鏈表、將鏈表中奇數值的結點重新組成一個新的鏈表。鏈表結點定義如下:

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

函數接口定義:

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );

函數readlist從標準輸入讀入一系列正整數,按照讀入順序建立單鏈表。當讀到−1時表示輸入結束,函數應返回指向單鏈表頭結點的指針。

函數getodd將單鏈表L中奇數值的結點分離出來,重新組成一個新的鏈表。返回指向新鏈表頭結點的指針,同時將L中存儲的地址改爲刪除了奇數值結點後的鏈表的頭結點地址(所以要傳入L的指針)。

裁判測試程序樣例:

#include <stdio.h>
#include <stdlib.h>

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

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
     struct ListNode *p = L;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    struct ListNode *L, *Odd;
    L = readlist();
    Odd = getodd(&L);
    printlist(Odd);
    printlist(L);

    return 0;
}

/* 你的代碼將被嵌在這裏 */

輸入樣例:

1 2 2 3 4 5 6 7 -1

輸出樣例:

1 3 5 7
2 2 4 6

大佬的答案參考:

//    Odd = getodd(&L); // 取 址  才能傳輸數據嗎?? 是因爲getodd 中無L的定義 必須用*L才能從外部數據傳輸? 
    
  //  printlist(Odd);    //prinlist 是爲了輸出鏈表數值重新 定義的函數 
struct ListNode *readlist()
{
    int data;
    struct ListNode *head=NULL; //頭節點爲空 
    struct ListNode *p;         
    
    while(scanf("%d",&data)&&data!=-1)
    {
        struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
        if(q!=NULL)
        {
            q->data=data;
            q->next=NULL;
        }
        else exit(1);  //exit(1)是異常退出,比如你的代碼在出現不應該出現的分枝,要求終止程序的時候就用exit(1)
        				//即 q不應當爲空 
        if(head!=NULL)
        {
             p->next=q; //增加鏈表 
        }
        else head=q; //第一次運行while 時 這一步都會做  
        p=q;       //把q的值交給p   使得下一次p->next=q;  起到q1 ->q2->q3->q4 的作用 //這是爲什麼呢?????
    }
    return head;  //返回頭節點  有了頭 就可以輸出下面所有的數據 
}
 
struct ListNode *getodd( struct ListNode **L ) //二級指針? 
{
    struct ListNode *head0=NULL,*head1=NULL,*p0,*p1;
    while((*L)!=NULL)
    {
        int data=(*L)->data;
        struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
        if(data%2)
        {
            if(q!=NULL)
            {
                q->data=data;
                q->next=NULL;
            }
            else exit(1);
            if(head1!=NULL)
            {
                p1->next=q;
            }
            else head1=q;
            p1=q;  //  p1存奇數  head1 
        }         //p0存偶數      head 0
        else
        {
            if(q!=NULL)
            {
                q->data=data;
                q->next=NULL;
            }
            else exit(1);
            if(head0!=NULL)
            {
             p0->next=q;
            }
            else head0=q;
            p0=q;
        }
        *L=(*L)->next;  
    }
    *L=head0; //分離結束以後 L 儲存偶數的值 
    return head1; //返回奇數的值 
}

做完一波筆記,待我看看怎麼才能更好理解~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章