IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法(C语言版)-第二章-链表知识点-2 -> 正文阅读

[数据结构与算法]数据结构与算法(C语言版)-第二章-链表知识点-2

单链表的基本操作

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

  1. 生成新结点作头结点,用头指针L指向头结点。
  2. 将头结点的指针域置空。
//先去建立一个结构体
typedef struct Lnode
{
    ElemType data;//储存数据
    struct Lnode *next;//储存下一个结点的地址
}Lnode,*LinkList;

Status InitList_L(LinkList &L)
{
    L = new LNode;//L = (LinkList) malloc (sizeof (LNode))
    L->next = NULL;
    return OK;
}

2.判断链表是否为空

  • 空表:链表中无元素,称为空链表(头指针和头结点仍然在)
//判断头结点指针域是否为空
int ListEmpty(LinkList L)
{
    if(L->next != NULL)//判断是否为空
    {
        return 0;    
    }
    else
    {
        return 1;    
    }
}

?3.单链表的销毁

  • 链表销毁后不存在。?

Status DestroyList_L(LinkList &L)
{
    Lnode *p;//或者LinkList p;
    while(L)//如果L不为空,就一直执行,当为空时,就退出循环
    {
        p = L;
        L = L->next;
        delete p;
    }
    return OK;

}

?4.清空链表

Status ClearList(LinkList &L)
{
    Lnode *p,*q;//设置两个结点
    P = L->next;
    while(p)//判断p数据域是否为空,为空的话就退出循环
    {
        q = p->next;
        delete p;
        p = q;
    }
    L->next = NULL;//头结点指针域为空
    return OK;
}

5.求单链表的表长?

  • ?算法思路:从首元结点开始,依次计数所有结点。
int ListLength(LinkList L)//返回L中数据元素的个数
{
    int i = 0;
    Lnode *p = L->next;//p指向第一个结点
    while(p)//判断p是否为空,如果为空就退出循环
    {
        i++;
        p = p->next;
    }
    return i;
}

6.取单链表中第i个元素的值

  • 算法思路:从链表的头指针出发,顺着链域next逐个结点往下搜索,直至搜索到第i个结点为止。
  • 算法步骤:
  1. ?从第1个结点(L->next)顺链扫描,用指针p指向当前扫描到的结点,p的初值p=L->next.
  2. j做计数器,累计当前扫描过的结点数,j的初值为1.
  3. 当p指向扫描到的下一个结点时,计数器j加1.
Status GetElem_L(LinkList L,int i,ElemType &e)//获取线性表L中的某个元素,并通过变量e返回
{
    Lnode *p = L->next;//初始化
    int j = 1;//j为计数器
    while(p && j < i)//顺指针向后查找,直到p指向第i个元素或p为空。
    {
        p = p->next;
        ++j;
    }
    if(!p || j > i)//判断第i个元素是否存在
    {
        return ERROR;
    }
    e = p->data;
    return OK;
}

?7.单链表的按值查找

7.1.?根据指定数据获取该数据所在的位置或地址

  • 获取地址算法步骤:
  1. 从第一个结点起,依次和e相比较。
  2. 如果找到一个与e值相等的数据,则返回在列表中的地址。
  3. 如果查遍整个链表都没有找到其值和e相等的元素,则停止循环返回0/NULL。
Lnode *LocateElem_L(LinkList L,Elemtype e)
{
    Lnode *p = L->next;//初始化
    while(p && p->data != e)
    {
        p = p->next;
    }
    return p;
}

7.2.?根据指定数据获取该数据所在的位置序号

  • 获取序号的算法:?
//在线性表L中查找值为e的数据元素的位置序号
int LocateElem_L(LinkList L,Elemtype e)
{
    Lnode *p = L->next;
    int j = 1;
    while(p && p->data != e)
    {
        p = p->next;
        j++;
    }
    if(p)
    {
        return j;
    }
    else
    {
        return 0;    
    }
  • ?算法分析:该算法的执行时间与待查找的值e相关, 其平均时间复杂度为O(n)。

?8.单链表的插入算法

//在L中第i个元素之前插入数据元素e,初始条件:1 <= i <= L.length
Status ListInsert_L(LinkList &L,ElemType e)
{
    Lnode *p = L;
    int j = 0;
    while(P && j < i-1)//寻找第i-1个结点,p指向i-1结点
    {
        p = p->next;
        ++j;
    }
    if(!p || j>i-1)//i大于表长+1或者小于1,插入位置非法
    {
        return ERROR;
    }
    Lnode *s = new Lnode;//生成新结点s
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}
  • 算法分析:?

?9.单链表的删除结点

  • ?删除第i个结点的算法步骤:
  1. ?首先找到第i-1个结点的存储位置p,保存要删除的a的值。
  2. 令p->next指向第i+1个结点。
  3. 释放第i个结点的空间。

  • p->next = p->next->next。
//将线性表L中第i个数据元素删除
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
    Lnode *p = L;
    int j = 0;
    while(p->next && j<i-1)//寻找第i个结点,并令p指向其前驱
    {
        p = p->next;
        ++j;
    }
    if(!(p->next) || j>i-1)//删除位置不合理
    {
        return ERROR;
    }
    q = p->next;//临时保存被删除结点的地址已被释放
    p->next = q->next;//改变删除结点前驱结点的指针域
    e = q->data;
    delete q;//释放删除结点的空间
    return OK;
}
  • 算法时间效率分析:由于要从头查找前驱结点,所耗时间复杂度为O(n);

10.单链表的建立?

10.1.头插法?

  • ?头插法:元素插入在链表头部,也叫前插法。
  1. 从一个空表开始,重复读入数据。
  2. 生成新结点,将读入数据存放新结点的数据域中
  3. 从最后一个结点开始,依次将各结点插入到链表的前端。?

void CreateList_H(LinkList &L,int n)
{
    L = new Lnode;
    L->next = NULL;//先建立一个带头结点的单链表
    for(int i = n,i>0,--i)
    {
        p = new Lnode;//生成新结点
        cin >> p->data;//输入元素值
        p->next = L->next;//插入表头
        L->next = p;
    }
}
  • 时间复杂度O(n)?

10.2.尾插法?

  • ?尾插法:元素插入在链表尾部,也叫后插法。
  1. 从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。
  2. 初始时,r同L均指向头结点。每读入一个数据元素则申请一个新结点,将新结点插入到尾结点后,r指向新结点。?

//正位序输入n个元素的值,建立带表头结点的单链表L
void CreateList_R(LinkList &L,int n)
{
    L = new Lnode;
    L->next = NULL;
    Lnode *r = L;//尾指针r指向头结点
    for(int i = 0,i<n,++i)
    {
        Lnode *p = new Lnode;//生成新的结点
        cin >> p->data;
        p->next = NULL;
        r->next = p;//插入到表尾
        r = p;//r指向新的尾结点
    }
}
  • 时间复杂度O(n)??

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:07:03  更:2022-10-08 21:07:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:53:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码