![数据结构(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=1738810031-w8fc2Tk1Qpj7N7Zfe5eKe80Oqa67iMok-0-08e68d231e91fea31aa96c644f62ca11)
(2)判断单链表是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_02.jpg?sign=1738810031-pOomcOQ4ulnGXPJNr4VscebK0864EO1c-0-9576b3e7da8534e19f7bfddae133340c)
(3)按序号查找操作。链表是一种随机存取结构,只能从头指针开始存取元素。因此,要查找单链表中的第i个元素,需要从单链表的头指针h出发,利用结点的next域依次访问链表的结点,并进行比较操作。利用计数器从0开始计数,当计数器为i时,就找到了第i个结点。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_03.jpg?sign=1738810031-iqAvi4ipHSHraRLePogUU1p9Kx2pOPD3-0-735dc5f1390247958ed8308c55205162)
(4)按内容查找操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/38_04.jpg?sign=1738810031-Gi1MdPUncEar3tschccJpT0PKUHMBWxV-0-9323057c8cbf1783781aff9f93d5d9a5)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_01.jpg?sign=1738810031-eGEjF3oCgJobvOXjkr8eFO2m56HISmVU-0-504c6f61ec8d46d91ac81076296a7fc3)
(5)定位操作。定位操作是指按内容查找并返回结点的序号的操作。从单链表的头指针出发,依次访问每个结点,并将结点的值与e比较,如果相等,返回该序号表示成功;如果没有值与e相等的元素,返回0表示失败。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_02.jpg?sign=1738810031-kKJ0TjpeFT0mvpr7xmTV0en2hTe14vRc-0-efcb202ccb2ab211fa0d1b853d78d316)
(6)插入操作。插入操作就是将元素e插入到链表中指定的位置i,插入成功返回1,否则返回0。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/39_03.jpg?sign=1738810031-jvBbCdUb07zpeCYo17kLAca5lJUDqBtO-0-20a05f854d663ccb27151c4b7115970c)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_01.jpg?sign=1738810031-ZR3i6bXDhiz7QKRlpqNLITXHLaFuCT6p-0-627362fb0e5c340b5550c56b143c39e9)
在单链表的第i个位置插入一个新元素e可分为3步进行:
①在链表中找到其直接前驱结点,即第i-1个结点,并由指针pre指向该结点,如图2.13所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_02.jpg?sign=1738810031-8qaIZE55mGRK6iqEBqE15uRYirn070p9-0-7459ec021c6d95a4ff7d1be173b7498b)
图2.13 找到第i个结点的直接前驱结点
②动态申请一个新的结点,并由p指向该结点,将值e赋值给p指向结点的数据域,如图2.14所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_03.jpg?sign=1738810031-DAIlw9jvZjYSK1gXwHqtL9fU4tgOylHN-0-9b480aa69021dd6d17eff75a37c61aae)
图2.14 p指向生成的新结点
③修改pre和p指向结点的指针域,如图2.15所示。这样就完成了在第i个位置插入结点的操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/40_04.jpg?sign=1738810031-3toN6bS3CvaEqf3Knejri5kdPf0D1BlA-0-437b075dc579148458cc384c8812b9cf)
图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=1738810031-fZEPL2h7cQJPPAlc4HYmcKmBSCWZ5IHs-0-5490726ecd6d07c17a233d99f2d684e2)
删除单链表中的第i个结点分为以下3个步骤:
①找到第i个结点的直接前驱结点,即第i-1个结点,并将指针pre指向该结点,指针p指向第i个结点,如图2.16所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/41_02.jpg?sign=1738810031-c6UEjeuWaPFBY5zBgLQMvYjT7VVUd9ps-0-6b51c34ce53eb7348453f938c6a57aa5)
图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=1738810031-n3wSlQ1wNf58mDJEBdJj9jsxgeQVxKL1-0-cb3e9f54ca581b5356ac9eea6b1730c8)
图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=1738810031-jEk4mW5MgfbiiJFvjl7aTsQGZjWRAqi0-0-16646d0fb96b6bf03b219cd09b5ece6c)
(9)销毁链表。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/42_02.jpg?sign=1738810031-Y8lje0kDpeE4UUE16lhGEoBUJkj5yVGw-0-22f6ba6b4be8c56988e61fa2675b2978)