![数据结构(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=1739302122-QgumeYXNDaOsuuAYsjHmxRHUnEIeTrXy-0-4d387dad11caa1db7bcbb2a931ced301)
(2)判断单链表是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_02.jpg?sign=1739302122-9BaiR3azPXL6TzGtGOKyh6kKmMX3VLan-0-bab630b689d4299963a202f3898cf9bb)
(3)按序号查找操作。链表是一种随机存取结构,只能从头指针开始存取元素。因此,要查找单链表中的第i个元素,需要从单链表的头指针h出发,利用结点的next域依次访问链表的结点,并进行比较操作。利用计数器从0开始计数,当计数器为i时,就找到了第i个结点。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_03.jpg?sign=1739302122-jjgzFQx69ar8DnmoPOXcZ7W0yQ5iIG6S-0-44824eaba4ef29b6484a21267617e095)
(4)按内容查找操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_04.jpg?sign=1739302122-9wmYqXDXtvodHl7C1GBmWMxvFJK1aoG0-0-417c7d6c996a8a261a347329cd3f6c9c)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_01.jpg?sign=1739302122-yAthqLjMFcGN6wqA8yohDKVa82qWYPvh-0-65fcf835535c2b27ff0c631bb0431485)
(5)定位操作。定位操作是指按内容查找并返回结点的序号的操作。从单链表的头指针出发,依次访问每个结点,并将结点的值与e比较,如果相等,返回该序号表示成功;如果没有值与e相等的元素,返回0表示失败。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_02.jpg?sign=1739302122-3YlRIgjx0rCOBKCypVpyBofadjlikDVd-0-333eef70f3f61dc25efa5bc8c44bbbf6)
(6)插入操作。插入操作就是将元素e插入到链表中指定的位置i,插入成功返回1,否则返回0。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_03.jpg?sign=1739302122-gya8Kn1hldJc3BN2g5fyfZ7BFx4PuwDD-0-da1ee85531de36d75b6ae714eb0ff131)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_01.jpg?sign=1739302122-ag3isVefOFQlWbJaprogfDEoGj9zDr6r-0-ddbb2c8402fef1a5d703848afd6aa9dd)
在单链表的第i个位置插入一个新元素e可分为3步进行:
①在链表中找到其直接前驱结点,即第i-1个结点,并由指针pre指向该结点,如图2.13所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_02.jpg?sign=1739302122-iPlolma7ZJhAYsunmvqs4DT6swCg9sMI-0-e07bfdf04c0d308de9b673e0999ee072)
图2.13 找到第i个结点的直接前驱结点
②动态申请一个新的结点,并由p指向该结点,将值e赋值给p指向结点的数据域,如图2.14所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_03.jpg?sign=1739302122-Xchq5FYxW5PLBaOZuqGH4Ku5eohUOu6R-0-e2498a669a3f1ebe684dca73412af5e1)
图2.14 p指向生成的新结点
③修改pre和p指向结点的指针域,如图2.15所示。这样就完成了在第i个位置插入结点的操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_04.jpg?sign=1739302122-F6OJoRHk0YnKCzwXbPgRts0Nr7UDyKY3-0-36830c0961d39bc17851cae3724cee61)
图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=1739302122-XYhdqIcw7cImZbld6Hfx4fmxxLGkQQMy-0-aee4eb74bfb8dc94112850cbaad2e67e)
删除单链表中的第i个结点分为以下3个步骤:
①找到第i个结点的直接前驱结点,即第i-1个结点,并将指针pre指向该结点,指针p指向第i个结点,如图2.16所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/41_02.jpg?sign=1739302122-DxMzTyRT5P13WOn8ABsaowah8vNKsGHu-0-ea8be54fa254376fa15f3f1a2785c1d3)
图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=1739302122-X0SiraTICd5S3dA82eFlaNLurvVA55pc-0-235d8dbb781e33f99367f02bd6dc90c2)
图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=1739302122-1eTs7VE2MbkK9HGCG1ElEe92vD9sdCUk-0-b97fadbe52baa956c4467be0280043ae)
(9)销毁链表。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/42_02.jpg?sign=1739302122-7ZisQP7qGUeXzMLCqflSA395dqGkuFZq-0-50b798af15028acb2939d997beacd439)