• 单链表结点删除


    单链表结点删除

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

    truct 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  {
                   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 *p,*tail,*head=NULL;
                while(1){
                    scanf("%d",&a);
                    if(a==-1) break;
                    p=(struct ListNode *)malloc(sizeof(struct ListNode));
                    p->data=a;
                    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,*p1,*p2,*t;
                while(L!=NULL&&L->data==m){
                    p=L;
                    L=L->next;
                    free(p);
                }
                if(L==NULL) return NULL;
                p1=L;
                p2=L->next;
                while(p2){
                    if(p2->data==m) {
                        p1->next=p2->next;
                        free(p2);
                    }
                    else p1=p2;
                    p2=p1->next;
                }
                return L;
            }
    
    
  • 相关阅读:
    linux运维之分析系统负载及运行状况
    linux运维之分析日志相关命令(1)
    centos7修改网卡名称为eth0
    LANMP环境编译参数查看方法
    自动化部署之搭建yum仓
    浙大 PAT 乙级 1001-1075 目录索引
    更改docker服务网段分配地址
    MySQL主从复制(Replication for Backup)
    MySQL读写分离-简单思考
    NGINX负载均衡缓存配置
  • 原文地址:https://www.cnblogs.com/hxz0618/p/11297516.html
Copyright © 2020-2023  润新知