当前位置: 首页 > 图灵资讯 > 技术篇> C语言实现链表节点的插入和删除

C语言实现链表节点的插入和删除

来源:图灵教育
时间:2023-05-23 09:24:19

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

看看代码。如果注释写得不好,请原谅我·················

/*                 插入和删除链表节点        编译环境: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;                            //        下一个节点的地址,PSwapp用于交换        _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    }

我自己画了两张照片来帮助理解。不管怎样,我是这么理解的。欢迎指出错误

在下向链表中插入节点

 

C语言实现链表节点的插入和删除_#include

 

以下是链表节点的删除

C语言实现链表节点的插入和删除_#include_02