单链表的常用算法

目录

一、判断链表是否为空

二、单链表的销毁:链表销毁后不存在

三、清空单链表:链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然在)

四、求单链表的表长

五、单链表的取值

六、单链表的按值查找

七、单链表的插入

八、单链表的删除——删除第i个结点

九、建立单链表:头插法——元素插入在链表头部,也叫前插法

十、建立单链表:尾插法——元素插入在链表尾部, 也叫后插法


一、判断链表是否为空

1、空表:链表中无元素,称为空链表,但头指针和头节点仍然存在。

2、算法思路:判断头结点的指针域是否为空。

3、算法描述

int ListEmpty(LinkList L){                   //若L为空表,则返回1,否则返回0

if(L->next)                                        //非空

return 0;

else

return 1;
}



二、单链表的销毁:链表销毁后不存在

1、算法思路:从头指针开始,依次释放所有结点。如下图所示:首先将头指针L赋给P,然后将头指针L指向下一个节点的指针域,之后删除指针P,结束条件为L等于空指针。

 2、核心语句:

p=L;

L=L-> next;

delete p;

结束条件: L==NULL        循环条件: L!=NULL

3、销毁单链表的算法描述

Status DestroyList L(LinkList &L){ //销毁单链表L
Lnode *p;                         //或LinkList p;

while(L) {

p=L;

L=L->next;

delete p;
}

三、清空单链表:链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然在)

1、算法思路:依次释放所有结点,并将头结点指针域设置为空。具体过程及核心语句如下图所示:

 2、清空单链表的算法描述

Status ClearList(LinkList & L){//将L重置为空表

Lnode *p,*q;                   //或LinkList p,q;

p=L->next;

while(p) {                    //没到表尾

q=p->next;

delete p;

p=q;
}

L->next=NULL; //头结点指针域为空
return OK;
}

四、求单链表的表长

1、算法思路:从首元结点开始,依次计数所有结点。

2、求单链表表长的算法描述

int ListLength_L(LinkList L){      //返回L中数据元素个数
   LinkList p;
   p=L->next;                     //p指向第一个结点
   i=0;
   while(p){                     //遍历单链表,统计节点数
       
    i++;
    p=p->next;
    
   }
   return i;
   
}

五、单链表的取值

1、算法思路:

从首元结点开始依次顺着链域next逐个向下搜索,只要指向当前结点的指针P不为空(NULL),并且没有到达序号为i的结点,则循环执行以下操作:p指向下一个结点;计数器相应加1。直至搜素到第i个节点为止。

2、单链表的取值算法描述

Status GetElem L(LinkList L, int i, ElemType &e){ //获取线性表L中的某个数据元素的内容,通过变量e返回

p=L->next; j=1;                             //初始化

while(p&&j<i ){                            //向后扫描,直到p指向第i个元素或p为空

p=p->next;++j;
}

if(!p||j>i) return ERROR;                 //第i个元素不存在

e=p->data;                               //取第i个元素

return OK;

}                                       //GetElem L

六、单链表的按值查找

1、算法步骤

①从第一个结点起,依次和e相比较。

②如果找到一个其值与e相等的数据元素,则返回其地址或者其在链表中的位置序号

③如果查遍整个链表都没有找到其值和e相等的元素,则返回0或"NULL"。

2、算法描述(返回其地址)

//在线性表L中查找值为e的数据元素的地址
Lnode *LocateELem_ L (LinkList L, Elemtype e) {

//在线性表L中查找值为e的数据元素

//找到,则返回L中值为e的数据元素的地址,查找失败返回NULL
p=L->next;

while(p &&p->data!=e)

p=p->next;

return p;

}

3、算法描述(返回其在链表中的位置序号)

//在线性表L中查找值为e的数据元素的位置序号

int LocateELem_L (LinkList L, Elemtype e) {

//返回L中值为e的数据元素的位置序号,查找失败返回0
p=L->next;j=1;

while(p&&p->data!=e)

{p=p->next; j++;}

if(p) return j;

else return 0;
}

七、单链表的插入

1、算法步骤如下图所示:

 2、算法描述

//在L中第i个元素之前插入数据元素e

Status ListInsert_L(LinkList &L,int i,ElemType e){

p=L;j=0;

while(p && j<i-1){p=p->next; ++j;}           //寻找第i-1个结点,p指向i-1结点
if(!p |j>i- 1)return ERROR;                 // i大于表长+1或者小于1,插入位置非法
s=new LNode; S->data=e;                    //生成新结点s, 将结点s的数据域置为e
S->next= p->next;                         //将结点s插入L中

p->next=s;

return OK;

}                                     //ListInsert_L

八、单链表的删除——删除第i个结点

1、算法步骤

 2、算法

//将线性表L中第i个数据元素删除

Status ListDelete_L(LinkList &L,int i,ElemType &e){

p=L;j=0;

while(p->next&&j<i-1){
p=p->next; ++j;                  //寻找第i个结点,并令p指向其前驱       
}



if(!(p->next)||j>i-1) return ERROR; //删除位置不合理

q=p->next;                         //临时保存被删结点的地址以备释放

p->next=q->next;                  //改变删除结点前驱结点的指针域

e=q->data;                       //保存删除结点的数据域

delete q;                       //释放删除结点的空间

return OK;

}                             //ListDelete_L

九、建立单链表:头插法——元素插入在链表头部,也叫前插法

1、算法步骤

①从一个空表开始,重复读入数据。

②生成新结点,将读入数据存放到新结点的数据域中。

③从最后一 个结点开始,依次将各结点插入到链表的前端。实例如下图所示:

 2、算法描述

void CreateList_H(LinkList &L,int n){

L=new LNode;

L->next=NULL; //先建立一个带头结点的单链表

for(i=n;i>0;--i){

p=new LNode;                  //生成新结点用c语言:p=(LNode*)malloc(sizeof(LNode);
cin>>p->data;               //输入元素值用c语言:scanf(&p->data);

p->next=L->next;            //插入到表头

L->next=p;
}

}                          //CreateList_H

注:上面的算法是直接用指针P来表示插入的结点

十、建立单链表:尾插法——元素插入在链表尾部, 也叫后插法

1、算法步骤

①从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。

②初始时,r同L均指向头结点。每读入一个数据元素则申请一个新结点,将新结点插入到尾结点后,r指向新结点。图形解释,如下图所示:

2、算法

 //正位序输入n个元素的值, 建立带表头结点的单链表L
void CreateList_R(LinkList &L, int n){

L=new LNode;L->next=NULL;

r=L;                          //尾指针r指向头结点

for(i=0;i<n;++i){

p=new LNode; cin>>p->data;      //生成新结点 ,输入元素值
p->next=NULL;
r->next=p;                     //插入到表尾

r=p;                          //r指向新的尾结点

}                            //CreateList_R

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜深人静码代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值