![数据结构(C语言实现)](https://wfqqreader-1252317822.image.myqcloud.com/cover/699/43806699/b_43806699.jpg)
2.3.2 单链表上的基本运算
单链表上的基本运算包括链表的建立、单链表的插入、单链表的删除、单链表的长度等。带头结点的单链表的运算具体实现如下(以下算法实现文件保存在“LinkList.h”中)。
(1)单链表的初始化操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_01.jpg?sign=1738767240-EzpnhGXTDxoBJGuW7wD2qwRlr34KT7vS-0-cd49b03a2ef975d2b86c7435615080e3)
(2)判断单链表是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_02.jpg?sign=1738767240-m1UmUNUKgJiWQHUNmXROhxXaGNCmWOJZ-0-8ac2c7b67fcf67f8647f46f38b8f70a8)
(3)按序号查找操作。链表是一种随机存取结构,只能从头指针开始存取元素。因此,要查找单链表中的第i个元素,需要从单链表的头指针h出发,利用结点的next域依次访问链表的结点,并进行比较操作。利用计数器从0开始计数,当计数器为i时,就找到了第i个结点。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_03.jpg?sign=1738767240-ZL7YvotxgrhnYmHam2q5H05A1AOvuTsx-0-592431f9263d3425abfbce686ee365d3)
(4)按内容查找操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_04.jpg?sign=1738767240-S0OsNnCS6ZX9YcLMFGcgHxwpVus2bItp-0-52eef995e9ca162c88357f198dc3c036)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_01.jpg?sign=1738767240-UeQ9Naloe0ylWCmpwMYQoctARVHvZ2XL-0-ea39154bb04fa95cb4cfff04508a048d)
(5)定位操作。定位操作是指按内容查找并返回结点的序号的操作。从单链表的头指针出发,依次访问每个结点,并将结点的值与e比较,如果相等,返回该序号表示成功;如果没有值与e相等的元素,返回0表示失败。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_02.jpg?sign=1738767240-4DDfH0zkxZASjvyoHigkTy1n1EWqszgH-0-75dcde5f8e3843a24d33ebb3dc8c2c81)
(6)插入操作。插入操作就是将元素e插入到链表中指定的位置i,插入成功返回1,否则返回0。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_03.jpg?sign=1738767240-H6JYdR9nJoRKVoFDFxIKffJhoe2Wh8zR-0-c22e2e19d5bd82094b089fcc26affbba)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_01.jpg?sign=1738767240-2F8q0PLIPWIJsyC8h4BFeU3dy7ndudUo-0-f2abe28ae80c329a2329347a9b5878a5)
在单链表的第i个位置插入一个新元素e可分为3步进行:
①在链表中找到其直接前驱结点,即第i-1个结点,并由指针pre指向该结点,如图2.13所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_02.jpg?sign=1738767240-BmnKpQbLvkQnZhxzzJJLjaFHIyBVfq2s-0-fe61ad764818d7307d2f4a818283ef3c)
图2.13 找到第i个结点的直接前驱结点
②动态申请一个新的结点,并由p指向该结点,将值e赋值给p指向结点的数据域,如图2.14所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_03.jpg?sign=1738767240-B3gy1r9Rl3G0PGXGdKcCwKdHbQUnILfN-0-1355fcf58a7cebd1a2405afcc6091754)
图2.14 p指向生成的新结点
③修改pre和p指向结点的指针域,如图2.15所示。这样就完成了在第i个位置插入结点的操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_04.jpg?sign=1738767240-FSlpFC8gF0t1rvuc4xuRzoKfINkOGVUx-0-b3016fa45da03ee7c5a604ef02734fdd)
图2.15 在单链表中插入新结点的过程
在单链表中插入新结点分为两个步骤:①将新结点的指针域指向第i个结点,即p->next=pre->next;②将直接前驱结点的指针域指向新结点,即pre->next=p。
注意:插入结点的操作步骤不能反过来,即先执行pre->next=p操作,后执行p->next=pre->next操作是错误的。
(7)删除操作。删除操作就是将单链表中的第i个结点删除,其他结点仍然构成一个单链表。删除成功返回1,否则返回0。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/41_01.jpg?sign=1738767240-L1pNx36ACdBJ8ucGUoR5ATn8rVlWHjit-0-e97675c56525cd0a81d91bb0a17f6739)
删除单链表中的第i个结点分为以下3个步骤:
①找到第i个结点的直接前驱结点,即第i-1个结点,并将指针pre指向该结点,指针p指向第i个结点,如图2.16所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/41_02.jpg?sign=1738767240-6TmE3H8vgx1gHcdLu6SvGcA9LHHpjEIz-0-a29c3386cde121d371ffbc32b0c3e729)
图2.16 找到第i-1个结点和第i个结点
②修改pre和p指向结点的指针域,使p指向的结点与原链表断开,即pre->next=p->next。
③动态释放指针p指向的结点。如图2.17所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/41_03.jpg?sign=1738767240-oq7scFUbMgqBrbYcJ526sH0enqUSZPqO-0-bfaae8c5aef6c75428ff6e0c868a3721)
图2.17 删除第i个结点
注意:在寻找第i-1个结点(被删除结点的前驱结点)时,要保证被删除结点存在,即pre->next->next!=NULL。如果没有该判断条件,且要删除的结点在链表中不存在,就会执行循环后出现p指向NULL指针域,从而造成错误。
(8)求表长。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/42_01.jpg?sign=1738767240-TMtM537GKz9zcMXQJYpKu44mPZDkURxP-0-3a1f7d45df98dd6f516283546c208a5a)
(9)销毁链表。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/42_02.jpg?sign=1738767240-ye0wleZtnKFt1q8YsclVACobVPK5z4YI-0-7688d1f7742c57c671b358c29ca511ee)