zoukankan      html  css  js  c++  java
  • 数据结构C语言实现----从链表中删除结点

    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct Node
    {
        char date;
        struct Node *next;
    }Node , *LinkList;
    //创建链表
    LinkList creat_linklist(int n)
    {
        LinkList New_node,Tail_node;
        LinkList Head_node = NULL;
        char c;
    
        for (size_t i = 0; i < n; i++)
        {
            printf("请输入在第%d个结点存入的数据:",i+1);
            scanf("%c",&c);
            fflush(stdin);
            New_node = (LinkList)malloc( sizeof(Node) );
            New_node->date = c;
            New_node->next = NULL;
    
            if (Head_node == NULL)
            {
                Head_node = New_node;
            }else
            {
                Tail_node->next = New_node;
            }
            Tail_node = New_node;
        }
        return Head_node;
    }
    //从链表中删除结点
    void delelink(LinkList *List , int m)
    {
        LinkList dele_node = *List;//复制一条链表用于找到要删除的结点
        for (size_t i = 1; i <m ; i++)//找到要删除的结点
        {
            dele_node = dele_node->next;
        }
        if (m==1)
        {//如果要删除的是第一个结点,就直接把头指针连接到第二个结点上
            *List = dele_node->next;
            free(dele_node);//注意释放删除的结点
        }else
        {//如果删除的不是第一个节点,找出要删除结点的前一个和后一个结点并连接起来
            LinkList befor_node = *List;//复制一条链表用于找到删除结点的前一个结点
            for (size_t i = 1; i<m-1; i++,befor_node = befor_node->next)
            {
            }
            befor_node->next = dele_node->next;//连接前后两个结点
            free(dele_node);//注意释放删除的结点
        }
    }
    int main()
    {
        int n;
        char c;
        LinkList List , List2;
        //List用于第一次打印单链表,List2用于第二次打印单链表
        printf("请输入结点个数:");
        scanf("%d",&n);
        fflush(stdin);
        List = creat_linklist(n);
        List2 = List;//复制一遍链表,第一次打印链表后链表后头指针会直接指向NULL,导致第二次打印失败
        printf("打印单链表:");
        while ( List != NULL )
        {
            printf("%c" , List->date);
            List = List->next;
        }
        putchar('
    ');
        printf("请输入要删除的结点:");
        scanf("%d",&n);
        fflush(stdin);
        delelink(&List2 , n);
        printf("打印单链表:");
        while ( List2 != NULL )
        {
            printf("%c" , List2->date);
            List2 = List2->next;
        }
        return 0;
    }
    

      

    运行结果:

  • 相关阅读:
    二叉苹果树|codevs5565|luoguP2015|树形DP|Elena
    没有上司的舞会|codevs1380|luoguP1352|树形DP|Elena
    NYOJ15|括号匹配(二)|区间DP|Elena
    AtCoder Beginner Contest 070|Elena|8.12|#471
    NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索
    7.26-STOIRegularMatch-08-#14
    跳石头|河中跳房子|NOIP2015提高组T4|二分法
    BZOJ2330: [SCOI2011]糖果
    BZOJ1295: [SCOI2009]最长距离
    BZOJ1263: [SCOI2006]整数划分
  • 原文地址:https://www.cnblogs.com/jerryleesir/p/13306077.html
Copyright © 2011-2022 走看看