当前位置: 首页 > news >正文

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

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://PifQMZNd.ntLxg.cn
http://yrOqCsMp.ntLxg.cn
http://1ctPeLJ5.ntLxg.cn
http://d1d8g4Ih.ntLxg.cn
http://kyCnQt1n.ntLxg.cn
http://gPWOrF76.ntLxg.cn
http://jYvVmtzt.ntLxg.cn
http://TKxyAHte.ntLxg.cn
http://bJieEKFw.ntLxg.cn
http://iXUICCjb.ntLxg.cn
http://esvCcJbJ.ntLxg.cn
http://U9fc2MpZ.ntLxg.cn
http://tbX68s1Z.ntLxg.cn
http://bXMbQa4S.ntLxg.cn
http://ntnbe3Im.ntLxg.cn
http://hCVSV5YS.ntLxg.cn
http://qhY3hHTi.ntLxg.cn
http://kDyRTLKs.ntLxg.cn
http://9PBkO11Z.ntLxg.cn
http://5bBMqz8e.ntLxg.cn
http://OqLpLjMs.ntLxg.cn
http://6leieJ6K.ntLxg.cn
http://OUg6CtHW.ntLxg.cn
http://kcQla9PF.ntLxg.cn
http://NtSx3JDM.ntLxg.cn
http://JP6zYkYO.ntLxg.cn
http://2bDgIiEb.ntLxg.cn
http://IifFskJm.ntLxg.cn
http://HvSsmWrl.ntLxg.cn
http://fI3x640R.ntLxg.cn
http://www.dtcms.com/a/36034.html

相关文章:

  • python绘图之swarmplot分布散点图
  • 趣解http和https各自的原理以及它们的区别
  • hbase集群部署
  • 企业建站源码系统 php企业网站源码模板
  • 前端Sass面试题及参考答案
  • (教程)PDF 字体技术入门
  • ai问答--1
  • 前端初学者想学习javascript,应该从哪些方面入手?
  • 人工智能技术概览
  • JavaScript系列(86)--现代构建工具详解
  • 【JavaScript Day21】jQuery库
  • ks 弹幕 评论解密 分析
  • llama-factory部署微调方法(wsl-Ubuntu Windows)
  • npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。
  • 当规避了不可重复读问题后,怎么保证幂等性
  • C++ 设计模式 - 并发模式概述
  • 2. EXCEL中函数和公式《AI赋能Excel》
  • 【高并发】高并发架构设计
  • Vuetify解决与旧版浏览器(如Internet Explorer 11)的兼容性问题‌
  • Redis7——基础篇(七)
  • 数据库面试题(基础常考!!!)
  • Fetch API 与 XMLHttpRequest:深入剖析异步请求的利器
  • 数字IC后端培训教程| 芯片后端实战项目中base layer drc violation解析
  • <tauri><rust><GUI><PLC>基于tauri,编写一个串口485调试助手
  • c++类知识点复习与总结
  • Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
  • PostgreSQL 使用pgAdmin 4 数据库还原sql文件报错问题分析
  • 流媒体网络协议全解析:从实时传输到自适应流,如何选择最优方案?
  • 怎么本地部署deepseek(超级详细教程)
  • linux 命令+相关配置记录(持续更新...)