zoukankan      html  css  js  c++  java
  • 【数据结构】C语言实现链表节点的插入和删除

    今天又学了下链表,发上来和菜鸟一起学习,欢迎大神指点···········

    今天我实现的是插入链表节点和删除链表节点。

    看代码吧,注释写的不好的就见谅吧················· 

    /*
                链表节点的插入与删除

           编译环境:VC++ 6.0
           编译系统:windows XP SP3
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>

    //    定义链表中的节点
    typedef struct node
    {
        int member;                //    节点中的成员
        struct node *pNext;        //    指向下一个节点的指针
    }Node,*pNode;

    //    函数声明
    pNode CreateList();                 //  创建链表函数
    void TraverseList(pNode );            //  遍历链表函数
    bool Insert_Node(pNode ,int ,int);    //    链表节点插入函数,第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据
    int Del_Node(pNode,int );        //    删除链表节点,第一个参数是头节点,第二个参数是删除第几个节点,第三个作为
    int main()
    {
        pNode pHead = NULL;                //  定义初始化头节点,等价于 struct Node *pHead == NULL
        int data;                        // 作为Insert_Node函数的第三个参数
        int num;                        //    作为Inset_Node函数第二个参数
        int choose;    
        int return_val;
        pHead = CreateList();            //  创建一个非循环单链表,并将该链表的头结点的地址付给pHead
        printf("你输入的数据是:");
        TraverseList(pHead);    //  调用遍历链表函数
        printf("是否还要进行如下操作:\n");
        printf("1.插入数据      2.删除数据\n");
        printf("请输入:");
        scanf("%d",&choose);
        switch (choose)
        {
            case 1:
                {
                    printf("请输入要在第几个节点前插入数据:");
                    scanf("%d",&num);
                    printf("请输入要插入的数据:");
                    scanf("%d",&data);
                    if(Insert_Node(pHead,num,data) == true)
                    {
                        printf("插入成功\n插入后的数据是:\n");
                        TraverseList(pHead);
                    }
                    else
                    {
                        printf("插入失败\n");
                    }
                    printf("操作完成后的数据是:");
                    TraverseList(pHead);
                    break;
                }
            case 2:
                {
                    printf("请输入要删除第几个节点的数据:");
                    scanf("%d",&num);
                    return_val = Del_Node(pHead,num);
                    if (return_val == 0)
                    {
                        printf("删除失败。\n");
                    }
                    else
                    {
                        printf("删除成功。删除的元素是:%d\n",return_val);
                    }
                    printf("操作完成后的数据是:");
                    TraverseList(pHead);
                }
        }
        return 0;
    }

    //    创建链表函数
    pNode CreateList()
    {
        int i;                                            //    用于下面循环
        int len;                                        //    用来存放有效节点的字数
        int val;                                        //    用于临时存放用户输入的数据
        pNode pHead = (pNode)malloc(sizeof(Node));        //  分配一个不存放有效数据的头结点
        pNode pTail = pHead;                            //    链表的最后一个节点
        pTail->pNext = NULL;                            //    最后一个节点的指针置为空
        printf("请输入节点个数:");
        scanf("%d",&len);
        for(i = 0; i < len; i++)
        {
            printf("第 %d 个节点的数值:",i+1);
            scanf("%d",&val);
            pNode pNew = (pNode)malloc(sizeof(Node));    //    为节点分配空间
            pNew->member = val;                            //将用户输入的数据赋给节点的成员
            pTail->pNext = pNew;                        //将最后一个节点的指针指向下一个新的节点
            pNew->pNext = NULL;                            //将新节点中的指针置为空
            pTail = pNew;                                //将新节点赋给最后的一个节点
        }
        return pHead;                                    //返回头节点

    }

    //    遍历链表函数
    void TraverseList(pNode pHead)
    {
        pNode p = pHead->pNext;                            //将头节点的指针给予临时节点p
        while(NULL != p)                                //节点p不为空,循环    
        {
            printf("%d ",p->member);                    
            p = p->pNext;                                
        }
        printf("\n");
        return ;
    }

    //    链表节点插入函数
    //    第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据
    bool Insert_Node(pNode pHead, int front,int data)
    {
        int i = 0;
        pNode _node = pHead;
        pNode pSwap;                                //    用于交换
        if ((front < 1) && (NULL != _node))        //判断用户输入的数据是否大于等于1,及_node是否为空
        {
            return false;
        }
        while (i < front - 1)                    //通过循环使指针指向要插入哪个节点前的节点。说的自己都不懂了,还是看下面的图吧。    
        {
            _node = _node->pNext;
            ++i;
        }
        pNode pNew = (pNode)malloc(sizeof(Node));

        pNew->member = data;                        //    把输入的数据赋给要插入的节点
        pSwap = _node->pNext;                        //    把下一个节点的地址,给用于交换的pSwap
        _node->pNext = pNew;                        //    把要插入的节点的地址,给上个节点的指针域
        pNew->pNext = pSwap;                        //    把插入节点的下一个节点的地址,给插入节点的指针域
        return true;

    }

    //    删除链表节点函数
    //    第一个参数是头节点,第二个参数是要删除第几个节点·······和上面的插入函数是不是很像
    int Del_Node(pNode pHead,int back)
    {
        int i = 0;
        int data;
        pNode _node = pHead;
        pNode pSwap;
        if ((back < 1) && (NULL == _node->pNext))
        {
            printf("删除失败!\n");
            return 0;
        }
        while(i < back-1)
        {
            _node = _node->pNext;
            ++i;
        }
        pSwap = _node->pNext;
        data = pSwap->member;
        _node->pNext = _node->pNext->pNext;
        free(pSwap);
        return data;


    我自己也画了两张图片,帮助理解,反正我是这么理解的,有错的欢迎指出

    先看下向链表中插入节点

     

    下面这个是删除链表节点

     

    欢迎各路神仙指正批评·············· 

  • 相关阅读:
    康托展开
    Linux Command Line Basics
    hihoCoder 1401 Registration
    C++ 参考网站
    Linux 下的常用工具
    SQL 命令
    GNU MAKE 笔记
    一道基本的计算几何题
    uva 1451 平均值
    bzoj 1826 缓存交换
  • 原文地址:https://www.cnblogs.com/scrat/p/2644086.html
Copyright © 2011-2022 走看看