• 习题11-8 单链表结点删除 (20 分)


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

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

    函数接口定义:

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

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

    函数 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 

    提交:

    #include <stdio.h>
    #include <stdlib.h>
    
    // struct ListNode {
    //     int data;
    //     struct ListNode *next;
    // };
    
    struct ListNode *readlist(){
        struct ListNode *head,*tail,*temp;
        temp = tail = (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 *deletem( struct ListNode *L, int m ){
        struct ListNode *tail,*temp;
        for (temp=L,tail=NULL;temp;) {
            if (temp->data == m) {//判断该节点是否需要删除
                if (tail){//tail存储的是上个节点,如果存在tail,即该节点不是L的头节点
                    tail->next = temp->next;
                    free(temp);
                    temp = tail->next;
                } else {//删除该节点
                    L = L->next;//tail节点不存在,该节点为L的头节点
                    temp = L;
                }
            } else {//该节点不需要删除
                tail = temp;
                temp = temp->next;
            }
        }
        return L;
    
    };
    // 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;
    }
    
    /* 你的代码将被嵌在这里 */
  • 相关阅读:
    Elasticsearch学习,请先看这一篇!
    加解密/数字签名/证书 原理
    C# 给对象赋null值会释放内存吗?
    打包常见问题
    友盟推送
    谈一谈可能用到数据持久化的地方
    浅谈设置字体大小
    AFN和SDWebImage请求网络图片的一点问题
    linux学习(1)——这是一个新的开始,加油吧少年
    C指针——简单总结
  • 原文地址:https://www.cnblogs.com/cgy-home/p/15047821.html
Copyright © 2020-2023  润新知