编写不带头结点单链表的插入操作和删除操作算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写不带头结点单链表的插入操作和删除操作算法相关的知识,希望对你有一定的参考价值。

参考技术A Status ListInsert(LinkList &L,int i,ElemType e)
// 在不设头结点的单链线性表L中第i个位置之前插入元素e
int j=1; // 计数器初值为1
LinkList s,p=L; // p指向第1个结点
if(i<1) // i值不合法
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); // 生成新结点,以下将其插入L中
s->data=e; // 给s的data域赋值e
if(i==1) // 插在表头
s->next=L; // 新结点指向原第1个结点
L=s; // L指向新结点(改变L)

else
// 插在表的其余处
while(p&&j<i-1) // 寻找第i-1个结点
j++; // 计数器+1
p=p->next; // p指向下一个结点

if(!p) // i大于表长+1
return ERROR; // 插入失败
s->next=p->next; // 新结点指向原第i个结点
p->next=s; // 原第i-1个结点指向新结点

return OK; // 插入成功


Status ListDelete(LinkList &L,int i,ElemType &e)
// 在不设头结点的单链线性表L中,删除第i个元素,并由e返回其值
int j=1; // 计数器初值为1
LinkList q,p=L; // p指向第1个结点
if(!L) // 表L空
return ERROR; // 删除失败
else if(i==1) // 删除第1个结点
L=p->next; // L由第2个结点开始(改变L)
e=p->data; // 将待删结点的值赋给e
free(p); // 删除并释放第1个结点

else
while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前驱
j++; // 计数器+1
p=p->next; // p指向下一个结点

if(!p->next||j>i-1) // 删除位置不合理
return ERROR; // 删除失败
q=p->next; // q指向待删除结点
p->next=q->next; // 待删结点的前驱指向待删结点的后继
e=q->data; // 将待删结点的值赋给e
free(q); // 释放待删结点

return OK; // 删除成功
追问

你编译了么~

本回答被提问者采纳

以上是关于编写不带头结点单链表的插入操作和删除操作算法的主要内容,如果未能解决你的问题,请参考以下文章

C实现头插法和尾插法来构建单链表(不带头结点)

线性表的链式表示

每天进步一点点之带头节点单链表

什么叫带头结点的链表? 什么叫不带头结点的链表?

Java带头节点单链表的增删融合以及是否有环

数据结构学习笔记——链表的相关知识(单链表带头结点和不带头结点的基本操作)