🍓个人主页:bit..
🍒系列专栏:Linux(Ubuntu)入门必看 C语言刷题
目录
1.单链表的初始化(带头节点的单链表)
2.判断单链表是否为空
3.单链表的销毁:销毁后链表不存在
4.清空链表
5.求单链表的表长
6.取值
7.查找
8.插入:在第i个结点前插入新结点
9.删除:删除第i个结点
1.单链表的初始化(带头节点的单链表)
算法步骤:
- 生成新结点做做头节点,用头指针L指向头节点。
- 将头节点的指针域置空。
status InitList L(LinkList &L){
L=new LNode; //C语言L=(LinkList)macll(sizeof(LNode));
L-->next=NULL;
return ok;
}
typedef struct Lnode{
ElemType data;
struct Lnode *next;
}LNode,*Linklist;
2.判断单链表是否为空
空表:链表中无元素,称为空链表(头指针和头节点任然存在)
思路:判断头节点指针域是否为空
int ListEmpty(LinkList L){
if(L-->next)
return o;
eles
return 1;
}
3.单链表的销毁:销毁后链表不存在
算法思路:从头指针开始,依次释放所有结点
Status DestroyList_l(LinkList &L){ //销毁单链表L
Lnod *p; //或LinkList p;
while(L){
p=L;
L=L-->next;
delete p;
}
return ok;
}
4.清空链表
链表任然存在,但链表中无元素,成为空链表(头指针和头节点任然存在)
算法思路:
依次释放所有结点,并将头节点指针域置为空。
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;
}
5.求单链表的表长
算法思路:从首元结点开始,依次计算所有节点
int ListLength_L(LinkList L){ //返回L中数据元素的个数
LinkList p; //或者LNode *p
p=L-->next;
i=0;
while(p){
i++;
p=p-->next;
}
return i
}
6.取值
取值——取单链表中第i个元素的内容(带头节点)
顺序表中 L-->elem[i-1] L-->Length
(随机存储)从头指针开始一直到找到输出
(从链表的头指针出发,顺着链域next逐个结点往下搜索,直至搜索到第i个为止,因此,链表不是随机存取结)
算法步骤
- 从第一个节点(L-->next)顺链扫描,用指针p指向当前扫描到的结点,p初始值p=L-->next
- j做计数器,累计当前扫描过的节点数,j初始值为1。
- 当p指向扫描到的下一结点时,计数器j加一
- 当j==i时,p所指的结点就是要找的第i个结点
status GetElem_L(LinkList L,int i,ElemTyoe &e){
//获取线性表L中的某个数据元素的内容,通过变量e返回
p=L-->next; j=1;
while(p&&j<i){ //向后扫描,直到p指向第i个元素或者p为空
p=p-->next;
++j;
}
if(!p||j>i) //第i个元素不存在
return ERROR;
e=P-->data; //取第i个元素
return ok;
}//GetElem_l
7.查找
按值查找:根据指定数据获取该数据元素所在的位置(该数据的地址)
按值查找:根据指定数据获取该数据所在的位置序号(是第几个数据元素)
算法步骤;
- 从第一个结点起,依次和e比较 p-->data!=e
- 如果找到一个其值与元素e相等的数据元素,则返回其在链表中的位置或者地址
- 如果查遍整个链表都没有找到其值和e相等的元素,则返回0或者NULL
算法描述:
1.返回地址
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;
}
return 0;
}
2.返回位置序号
int LocateElem_L(LinkList L,Elemtype e){
//在线性表L中查找值为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;
}
8.插入:在第i个结点前插入新结点
算法步骤:
- 首先找到ai-1的存储位置p
- 生成一个数据域为e的新结点s
- 插入新节点:1.新结点的指针域指向结点ai 2.结点ai-1的指针域指向新结点
算法描述
//在L中第i个元素之前插入数据元素e
Status Listlnsert_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大于表长加一或者小于一,插入元素非法。
s=new LNode;
s-->data=e;
//生成新节点s将s数据域置为e
s-->next=p-->next;
p-->next=s; //将结点s插入L中
return ok;
}//Linklist_L
9.删除:删除第i个结点
算法步骤:(找到i-1结点)
- 首先找到ai-1的存储位置p,保存需要删除aj的值
- 令p-->next 指向ai+1
- 释放结点a的空间
算法描述;
//将线性表L中第i个元素数据元素删除
status ListDelete_L(LinkList &L,int i,ElemType &e){
p=L;j=0;q;i;
while(p-->next&&j<j-1)
{
p=p-->next;
++j;
}//寻找第i个结点,并令p指向其前驱
if(!(p-->next)||j>j+1)
return ERROR;//删除位置不合理
q=p-->next; //临时保存被删除结点的地址以备释放
p-->next=q-->next; //改变删除结点前驱结点的指针域
e=q-->next;
delept q; //释放删除结点的空间
return ok;
} //ListDelete_L