数据结构与算法——单链表的基本操作的实现

🍓个人主页:bit.. 

🍒系列专栏:Linux(Ubuntu)入门必看   C语言刷题

目录

1.单链表的初始化(带头节点的单链表)

2.判断单链表是否为空

3.单链表的销毁:销毁后链表不存在 

4.清空链表

5.求单链表的表长

6.取值

7.查找

8.插入:在第i个结点前插入新结点

9.删除:删除第i个结点


 1.单链表的初始化(带头节点的单链表)

算法步骤:

  1. 生成新结点做做头节点,用头指针L指向头节点。
  2. 将头节点的指针域置空。
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.查找

按值查找:根据指定数据获取该数据元素所在的位置(该数据的地址)

按值查找:根据指定数据获取该数据所在的位置序号(是第几个数据元素)

算法步骤;

  1. 从第一个结点起,依次和e比较  p-->data!=e
  2. 如果找到一个其值与元素e相等的数据元素,则返回其在链表中的位置或者地址
  3. 如果查遍整个链表都没有找到其值和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结点)

  1. 首先找到ai-1的存储位置p,保存需要删除aj的值
  2. 令p-->next 指向ai+1
  3. 释放结点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

 

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bit..

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

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

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

打赏作者

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

抵扣说明:

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

余额充值