• pta 奇数值结点链表&&单链表结点删除


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

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


    记录一下自己怎么写的,毕竟第一次写链表:

    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);
            if(head!=NULL)
            {
                 p->next=q;
            }
            else head=q;
            p=q;
        }
        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;
            }
            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;
        return head1;
    }

    本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:

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

    函数接口定义:

    struct ListNode *readlist();
    struct ListNode *deletem( struct ListNode *L, int m );
    

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

    函数deletem将单链表L中所有存储了m的结点删除。返回指向结果链表头结点的指针。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    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()
    {
        int data;
        struct ListNode *head=NULL,*p;
        while(scanf("%d",&data)&&data!=-1)
        {
            struct ListNode *q=(struct ListNode *)malloc(sizeof(struct ListNode));
            if(q==NULL)exit(1);
            else
            {
                q->data=data;
                q->next=NULL;
            }
            if(head==NULL)
            {
                head=q;
            }
            else
            {
                p->next=q;
            }
            p=q;
        }
        return head;
    }
    struct ListNode *deletem( struct ListNode *L, int m )
    {
        int data;
        struct ListNode *p,*head=NULL;
        while(L!=NULL)
        {
            data=L->data;
            L=L->next;
            if(data!=m){
            struct ListNode *q=(struct ListNode *)malloc(sizeof(struct ListNode));
            if(q==NULL)exit(1);
            else
            {
                q->data=data;
                q->next=NULL;
            }
            if(head==NULL)
            {
                head=q;
            }
            else
            {
                p->next=q;
            }
            p=q;
            }
        }
        return head;
    }
  • 相关阅读:
    laravel 文件上传总结
    报错:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin' for key 'username'...
    php下intval()和(int)转换使用与区别
    js向input的value赋值
    北京ArcGis Server开发培训例子(整理)
    C#中Tostring参数机用法详解(转)
    ArcGIS Server 10 服务器要求
    arcgis10 arcmap mxd文档所有保存为相对路径
    google map api简单例子1 定位预览
    ASTER GDEM简介 30m,dem免费下载
  • 原文地址:https://www.cnblogs.com/8023spz/p/7294936.html
Copyright © 2020-2023  润新知