知识大全 数据结构之单链表基本运算的实现[9]
Posted 结点
篇首语:愁人苦夜长,志士惜日短。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构之单链表基本运算的实现[9]相关的知识,希望对你有一定的参考价值。
if (!p)
printf( 参数 i 错 );
return ( ); /*第i个结点不存在不能删除*/
q=p >next; /*q指向第i个结点*/
p >next=q >next; /*从链表中删除*/
free(q); /*释放*s */
return ( );
该算法同插入算法一样 时间主要消耗在查找第i 个元素结点上 故其时间复杂度为O(n)
另外 在上面插入和删除的算法中 第一个元素结点的处理和其它结点是相同的 因为在第一个元素结点之前有一个 头结点 (可以看作是第 个结点) 所以我们在查找第i 个元素结点时 只要i值合法 总能找到第i 个结点的指针 处理起来非常方便;如果采用不带头结点的单链表 则需要对插入位置具体考虑 在第一个元素结点之前插入时 它没即可有直接前驱结点需修改头指针;而在其它结点之前插入时 只要找到前驱结点地址(指针)进行正常插入即可 在不带头结点的链表中删除结点时 删除第一个结点和其它结点的处理也是不同的 删除第一个结点要修改头指针变量 其它结点删除只要修改其直接前驱的指针域即可 有兴趣的读者可以考虑用不带头结点的单链表实现插入 删除操作 比较一下它们的区别 以便进一步理解单链表的插入和删除操作的实现 总之 在通常情况下 无表头结点的单链表在处理时往往比有表头结点的单链表更为复杂
cha138/Article/program/sjjg/201311/23074相关参考
销毁单链表 单链表被构造使用完后由于其结点均为动态分配的内存空间所以必须要销毁以释放空间否则会造成申请的内存不能释放单链表的销毁操作是创建操作的逆运算由于要修改单链表的头指针的指针变量所以要将头
图双向链表中的结点删除 双向链表的结束条件和单链表相同双向循环链表的结束条件和单向循环链表的结束条件相同 静态链表 根据上节单链表的知识用单链表表示线性表时其结点空间是在运行时根据需要动态分
求表长 由于单链表采用离散的存储方式并且没有显示表长的存储信息因此要求出单链表的表长必须将单链表遍历一遍 算法思路设一个移动指针p和计数器count初始化后p指向头结点p后移一个结点count
循环链表 对于单链表而言最后一个结点的指针域是空指针如果将该链表头指针置入该指针域则使得链表头尾结点相连就构成了循环单链表(也称单循环链表)如图所示 > 图带头结点的单循环链表 对循环单链
双向链表结点的定义如下 typedefstructnode DataTypedata; structnode*prior*next; DuNode*DLinkList; 和单链表类似双向
删除 删除运算是指删除单链表的第i个结点即将第i个元素结点的指针域指向第i+个元素结点要实现删除首先要找到第i个元素结点前驱结点设单链表第i个元素结点指针为p要删除第i个元素结点(指针为q)操作
算法如下 LinkListmerge_LinkList(LinkListALinkListB) /*设AB均为带头结点的单链表A和B归并成C返回C*/ LinkListC; LinkLis
查找操作 ()按序号查找 从单链表的第一个元素结点起判断当前结点是否是第i个若是则返回该结点的指针否则继续下一个结点的查找直到表结束为止若没有第i个结点则返回空如果i=返回头指针 算法如下
()按值查找 单链表的按值查找是在线性表存在的情况下查找值为x的数据元素若成功返回首次出现的值为x的那个元素所在结点的指针;否则未找到值为x的数据元素返回NULL表示查找失败 算法思路从链表的
if(!p) printf(i有误); return(); q=(LinkList)malloc(sizeof(LNode)); if(!q) printf(申请空间失败);