数据结构 1-2 线性表的链式存储-链表

news/2025/2/25 19:12:44

1 原理

顺序表的缺点:

  • 插入和删除移动大量元素
  • 数组的大小不好控制
  • 占用一大段连续的存储空间,造成很多碎片

链表规避了上述顺序表缺点

逻辑上相邻的两个元素在物理位置上不相邻

头结点

L:头指针

头指针:链表中第一个结点的存储位置,用来标识单链表

头结点:在单链表第一个结点之前附加的一个结点,为了操作上的方便。

   若链表有头结点,则头指针永远指向头结点,不论链表是否为空,头指针均不为空,头指针是链表的必须元素,他标识一个链表。头结点是为了操作的方便而设立的,其数据域一般为空,或者存放链表的长度。有头结点后,对在第一结点前插入和删除第一结点的操作就统一了,不需要频繁 重置头指针。但头结点不是必须的。

 优缺点

优点:

  • 插入和删除操作不需要移动元素,只需要修改指针
  • 不需要大量的连续存储空间

缺点:

  • 链表附加指针域,也存在浪费存储空间的缺点
  • 查找操作时需要从表头开始遍历,依次查找,不能随机存取

2 表示

2.1 定义

typedef int ElemType ;

typedef struct LNode{ //单链表结点类型
    ElemType  data; //数据域
    struct LNode* next;//指针域
}LNode, *LinkList;

2.2 新建链表

2.2.1 头插法新建链表

void list_head_insert(LinkList &L)
{
    ElemType x;
    LNode *s;
    L= (LinkList)malloc(sizeof(LNode));//申请头节点空间
    L->next = NULL;
    scanf("%d",&x);

    while(x!=9999)
    {
        s= (LinkList)malloc(sizeof(LNode));//申请节点空间
        s->data = x;
        s->next = L->next;//指向原本第一个节点
        L->next = s; //头结点的next
        scanf("%d",&x);
    }
}
 2.2.2 尾插法新建链表

void list_tail_insert(LinkList &L)
{
    L= (LinkList)malloc(sizeof(LNode));//申请头节点空间
    ElemType x;
    LNode *s, *r = L;//s是用来指向新节点,r始终指向链表尾部
    L->next = NULL;
    scanf("%d", &x);
    while(x!=9999)
    {
        s = (LinkList) malloc(sizeof(LNode));
        s->data=x;
        r->next = s;
        r=s;
        scanf("%d", &x);
    }
    r->next=NULL;//让为节点的next=NULL

}

 2.3 打印链表

void print_list(LinkList L)
{
    L = L->next;
    while(L != NULL)
    {
        printf("%3d",L->data);
        L =L->next;
    }
    printf("\n");
}

2.4 查找

2.4.1 按位置查找

头节点代表第0个位置

 

//按位置查找
LinkList GetElem(LinkList L, int SearchPos)
{
    int i = 0;
    if(SearchPos < 0)
    {
        return NULL;
    }
    while(L && i < SearchPos)
    {
        L = L->next;
        i++;
    }
    return L;
}
2.4.2 按值查找

//按值 查找
LinkList LocateElem(LinkList L, ElemType SearchVal)
{
    while(L)
    {
        if(L->data ==SearchVal)
        {
            return L;
        }else
        {
            L =L->next;
        }
    }
    return NULL;

}

 2.5 插入

插入情况 

 

bool ListFrontInsert(LinkList L, int InsertPose, ElemType InsertValue)
{
    LinkList  p = GetElem(L, InsertPose-1);

    if(p == NULL)
    {
        return false;
    }
    LinkList q ;
    q =(LinkList)malloc(sizeof(LNode));
    q->data = InsertValue;
    q->next = p->next;
    p->next = q;
    return true;

}

2.6 删除

删除注意的点:

  • 需要释放删除节点的空间
  • 需要判断删除的位置是否存在

​​​​​​​

void dele_elem(ListLink L, int pos) {
    if (pos <0) {
        return ;
    }
    ListLink r,q; //q用来存储要删除的节点
    r = find_elem(L, pos -1);
    if (NULL == r) {
        return;
    }
    q=r->next;
    if (q==NULL)
    {return;}
    r->next = q->next;//断链
    free(q);
    q = NULL;//防止野指针
}

引用:要不要对变量进行赋值,如果不用不加引用,若要加引用


http://www.niftyadmin.cn/n/5865868.html

相关文章

【C】初阶数据结构7 -- 树与顺序结构的二叉树(堆)

这篇文章将会介绍一个新的数据结构 -- 树&#xff0c;以及一种特殊的树 -- 二叉树&#xff0c;并用数组来实现二叉树&#xff0c;用数组实现的二叉树也叫做堆。 目录 1 树 1&#xff09; 树的概念 2&#xff09; 树的结构 &#xff08;1&#xff09; 逻辑结构 &#xff0…

【react】进阶教程01

目录 一、性能优化策略 1. 组件渲染优化 2. 虚拟 DOM 优化 3. 代码分割&#xff08;Lazy Loading&#xff09; 二、高级 Hooks 模式 1. 自定义 Hook 2. useReducer 复杂状态管理 三、状态管理进阶 1. Redux Toolkit 现代 Redux 实践 2. 状态选择器优化 四、高级组件模…

【解析】跨网文件安全交换系统:打破网络壁垒,解锁高效传输!

在数字化办公成为主流的当下&#xff0c;企业的网络环境愈发复杂。为了应对日益严峻的网络安全威胁&#xff0c;满足合规性要求&#xff0c;许多企业都选择了将内部网络划分为内网和外网&#xff0c;进行严格的隔离。这种隔离措施就像在企业的信息资产周围筑起了一道坚固的防线…

【漫话机器学习系列】104.机器学习中的“学习”是什么?(Learning In Machine Learning)

1. 引言 在人工智能&#xff08;AI&#xff09;和机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;领域&#xff0c;我们常听到“机器学习”这个术语&#xff0c;但“学习”究竟意味着什么&#xff1f;机器如何学习&#xff1f;它的学习过程与人类的学习有何异…

了解大模型LLM:部署、优化与框架

LLM服务指的是部署和运行大型语言模型&#xff08;LLM&#xff09;以处理用户请求的过程。这涉及获取通常经过离线训练的LLM&#xff0c;并将其设置为能够实时响应查询。 以下是LLM服务的具体内容细分 高效处理&#xff1a;由于LLM的计算成本高昂&#xff0c;因此会采用诸如将多…

AI绘画软件Stable Diffusion详解教程(1):版本发展历程与选择建议

Stable Diffusion作为一个强大的文本到图像的扩散模型&#xff0c;在短短几年内发布了多个衍生版本。以下是对其衍生版本及本地化部署选择的详细分析&#xff1a; 一、Stable Diffusion衍生版本 1.Latent Diffusion 由CompVis开发&#xff0c;包含文本到图像和inpainting功能…

IP----访问服务器流程

1.访问服务器流程 1.分层 1.更利于标准化 2.降低层次之间的关联性---每一层都只完成自身层次所执行的功能--每一层都在下层的基础上提供增值服务 1.应用层 抽象语言---编码---提供人机交互的接口 2.表示层 编码--二进制&#xff0c;压缩解压缩、格式转换 3.会话层 建立…

k8s使用containerd作为容器运行时配置Harbor私有仓库与阿里云私有仓库以及镜像加速器,k8s基于containerd如何配置harbor私有仓库

至于containerd大家还需要在去学习以下使用的命令。 版本介绍 k8s&#xff1a;v1.28.2containerd&#xff1a;1.6.33 1.配置containerd镜像加速器 [rootmaster ~]# vim /etc/containerd/config.toml ---编辑containerd配置文件找到以下位置新添加 [plugins."io.contain…