题目描述:

KiKi学习了结构体和指针,他了解了结构体类型可以定义包含多个不同类型成员,而指针本质是内存地址,是引用数据的另外一种方式。现在他想将多个输入的数据通过结构体和指针的方式连接在一起,形成一个单向链表,即:每个结点是结构体类型,包括整型数据成员(data)和结构体指针类型成员(next),每个结点的指针部分指向下一个输入的结点。具体建立过程如下:先输入n个整数,按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。输出删除后的单链表信息。

输入描述:

包括三行: 第一行输入数据个数n (3≤n≤100); 第二行依次输入n个整数,用空格分隔; 第三行输入欲删除数据m。

输出描述:

包括两行: 第一行输出完成删除后的单链表长度;

第二行依次输出完成删除后的单链表数据。

#include <stdio.h>

//链表结点的定义方式
struct Node
{
    int data; //数据域
    struct Node* next; //指针域
};
int main()
{
    struct Node* list = NULL; //指向链表的指针
    struct Node* tail = NULL; //指向链表尾巴的指针
    
    int n = 0;
    scanf("%d",&n);
    int i = 0;
    int m = 0;//每次录入的整数
    //接受n个数字,并尾插到链表中
    for(i=0; i<n; i++)
    {
        scanf("%d",&m);
        struct Node* pn =(struct Node*) malloc(sizeof(struct Node));
        pn->data=m;
        pn->next=NULL;
        //插入第一个元素
        if(list == NULL) //头部覆盖
        {
            list = pn;
            tail = pn;
        }
        else //尾部覆盖
        {
            tail -> next = pn;
            tail = pn;
        }
        
    }
    //获取要删除的元素
    int del = 0;
    scanf("%d",&del);
    
    //删除指定的元素
     struct Node* cur = list;
     struct Node* prev = NULL; // 记录的是要删除元素的前一个元素的地址
    
    while(cur)
    {
        //找到了要删除的元素
        if(cur->data == del)
        {
            //删除
            //删除的如果是第一个结点
            struct Node* pd = cur;//指向要删除的元素
            if(cur == list)
            {
                list = list->next;
                cur = list;
            }
            else//如果删除的不是第一个结点
            {
                prev->next = cur->next;
                cur = prev->next;
            }
            free(pd);
            n--;
        }
        else
        {
            prev = cur;
            cur = cur->next;
        }
    }
    
    //输出
    printf("%d\n",n);
    //使用while循环进行遍历单链表
    cur = list;
    while(cur)
    {
        printf("%d ",cur->data);
        cur = cur->next;
    }
    
    //释放单链表
    cur =list;
    struct Node* enddel = NULL;
    while(cur)
    {
        enddel = cur;
        cur = cur->next;
        free(enddel);
    }
    list = NULL;//将list置为空指针
    return 0;
}