• 习题11-7 奇数值结点链表 (20 分)


    本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:

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

    函数接口定义:

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

    函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−时表示输入结束,函数应返回指向单链表头结点的指针。

    函数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("
    ");
    }
    
    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

    提交:

    #include <stdio.h>
    #include <stdlib.h>
    
    // struct ListNode {
    //     int data;
    //     struct ListNode *next;
    // };
    
    struct ListNode *readlist(){
        struct ListNode *head,*tail,*temp; //head->头节点,tail->尾节点,temp->临时开辟节点
        tail = temp = (struct ListNode*)malloc(sizeof(struct ListNode));//尾节点开始也指向临时开辟节点
        head = NULL;
        int cnt = 0;//节点个数
        scanf("%d",&temp->data);
        while(temp->data != -1){
            cnt++;
            if (cnt == 1) head = temp;
            else tail->next=temp;
            tail = temp;
            temp = (struct ListNode*)malloc(sizeof(struct ListNode));
            scanf("%d",&temp->data);
        }
        tail->next=NULL;
        return head;
    };
    struct ListNode *getodd( struct ListNode **L ){
        //struct ListNode *p = *L;
        struct ListNode *odd_head,*odd_tail,*odd_temp;//新得奇数链表
        struct ListNode *even_head,*even_tail;//新得偶数链表
        odd_tail = even_tail = odd_temp = malloc(sizeof(struct ListNode));
        odd_head = even_head = NULL;
        int cnt1 = 0,cnt2 = 0;//cnt1为奇书链表节点个数,cnt2为偶数链表节点个数
        while(*L){
            odd_temp->data = (*L)->data;
            odd_temp->next = NULL;
            if ((*L)->data%2 == 1) {//奇数节点
                cnt1++;
                if (cnt1 == 1) odd_head = odd_temp;//插入奇数链表
                else odd_tail->next = odd_temp;
                odd_tail = odd_temp;
            } else {//偶数节点
                cnt2++;
                if (cnt2 == 1) even_head = odd_temp;
                else even_tail->next = odd_temp;
                even_tail = odd_temp;
            }
            odd_temp = (struct ListNode*)malloc(sizeof(struct ListNode));
            *L = (*L)->next;
        }
        *L = even_head;
        return odd_head;
    };
    // void printlist( struct ListNode *L )
    // {
    //      struct ListNode *p = L;
    //      while (p) {
    //            printf("%d ", p->data);
    //            p = p->next;
    //      }
    //      printf("
    ");
    // }
    
    int Main()
    {
        struct ListNode *L, *Odd;
        L = readlist();
        Odd = getodd(&L);
        printlist(Odd);
        printlist(L);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
  • 相关阅读:
    C#(winform)浏览按钮
    C#操作CSV存取类
    忘记windows的登陆密码
    exe文件打开方式(恢复EXE文件关联)
    MongoDB 搭建副本集
    Performance Monitor3:监控SQL Server的内存压力
    大数据操作:删除和去重
    SSRS配置2:加密管理
    SSISDB7:当前正在运行的Package及其Executable
    不再迷惑,无值和NULL值
  • 原文地址:https://www.cnblogs.com/cgy-home/p/15046902.html
Copyright © 2020-2023  润新知