数据结构——线性表(单链表)

news2024/11/14 21:42:05

一、链式存储结构定义

线性表的链式存储结构定义是指使用指针将线性表中的元素按照其逻辑次序依次存储在存储空间中,通过指针来表示数据元素之间的逻辑关系。具体来说,链式存储结构由数据域和指针域组成,数据域存储数据元素的数值,指针域存储下一个元素的地址。这样就可以通过指针将各个元素串联起来,形成一个链表结构。这种存储结构能够更灵活地动态管理内存空间,适用于需要频繁插入、删除操作的情况。

注:线性表的链式存储结构的特点是用一组任意 的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。这就意味着,这些数据元素可以存在内存未被占用的任意位置

n个结点(ai的存储映像)链结成一个链表,即为线性表(a1,a2,…,an)的链式存储结构,因为此链表的每个结点中只包含一个指针域,所以叫做单链表。

注:链表中的第一个结点的存储位置叫做头指针。

头指针和头节点区别

链表的头指针是指向链表第一个节点的指针,它用来标识整个链表的起始位置。而头节点是在链表的头部额外增加的一个节点,它不存储实际数据,只是为了方便对链表的操作而设置的。头节点的引入可以简化链表的插入、删除等操作,使得代码逻辑更加清晰。

二、单链表基本操作

1、单链表存储结构

typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;

typedef Node *LinkList; /* 定义LinkList */

2、创建单链表

1)单链表创建(只创建表头,不添加其他节点)
//创建单链表
LinkList LinkList_create(){
    LinkList header = (Node *)malloc(sizeof(Node));
    if(header == NULL)
    {
        printf("内存分配失败");
        return NULL;
    }
    // header->data = 0;
    header->next = NULL;
    return header;
}
2) 单链表创建(创建表头,并添加其他元素)——头插法

算法思路:

  1. 声明一结点和计数器变量
  2. 初始化一空链表 L;
  3. 让L的头结点的指针指向 NULL ,即建立一个带头结点的单链表。
  4. 循环
  • 生成 新结点赋值给 p;
  • 随机生成 数字赋值给 的数据域 p->data;
  • 将p插入到头结点与前一新结点之间。
//单链表整表创建
LinkList LinkList_all_create(LinkList list,int n){
    list = (LinkList)malloc(sizeof(LinkList));
    list->next = NULL;
    LinkList p;
    srand(time(0));//生成随机数种子
    for(int i = 0;i < n;i++)
    {
        p = (LinkList)malloc(sizeof(Node));
        p->data = rand()%100+1;//生成随机数
        p->next = list->next;
        list->next = p;
    }  
    return list;
}

3、插入单链表元素

算法思路:

  1. 使用循环找到第i个元素位置
  2. 生成新的节点s,并将e赋值给s->data;并更换节点位置
  3. 核心思想:将节点的s->next = p->next;p->next = s;

   

//单链表L中第i个元素位置插入e值
int Linklist_insert(LinkList list,int i,ElemType e)
{
    int j;
    LinkList p;
    p = list;
    for(j = 0;j < i&& p;j++)
    {
        p = list->next;
    }
    LinkList s = (LinkList )malloc(sizeof(Node));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

 4、删除单链表元素操作

算法思路:

1.声明一结点p指向链表第一个结点,初始化j从1开始;

2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;

3.若到链表末尾p为空,则说明第i个元素不存在;

4.否则查找成功,将欲删除的结点p->next赋值给q;

5.单链表的删除标准语句p->next=q->next

6.将q结点中的数据赋值给e,作为返回;

7.释放q结点;

8.返回成功。
 

//单链表L中删除第i个元素
int Linklist_del(LinkList list,int i)
{
    int j;
    LinkList p = list;
    Node *q = (Node *)malloc(sizeof(Node));
    for(j = 0;j < i&& p;j++)
    {
        p = p->next;
    }
    if(!(p->next) || j > i)
    {
        return ERROR;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return OK;
}

5、打印链表中所有元素

算法思路:

当list->next不为空时,就遍历链表,让p的指针向后移动,不断指向下一个结点,打印list->data

//打印单链表中所有的元素
void LinkList_print(LinkList list){
    list = list->next;
    printf("单链表中所有元素如下:");
    while(list != NULL)
    {
        printf("%d ",list->data);
        list = list->next;
    }
    printf("\n");
}

 6、查看链表中指定位置的元素值

算法思路:

  1. 声明一个结点p指向链表第一个结点,初始化j从1开始;
  2. 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;若到链表末尾p为空,则说明第1个元素不存在;
  3. 否则查找成功,返回结点p的数据。
//返回L中第i个数据元素的值
ElemType LinkList_getElem(LinkList list,int i,ElemType e)
{
    int j;
    LinkList p = list->next; 
    for(j = 1;j < i&& p;j++)
    {
        p = p->next;
    }
    if(j > i|| !p )
    {
        return ERROR;
    }
    e = p->data;
    return e;
}

7、销毁单链表

算法思路:

  1.  声明一结点p和q;
  2. 将第一个结点赋值给p;
  3. 循环:
  • ◆将下一结点赋值给q;
  • ◆释放p;
  • ◆将q赋值给p。
//销毁单链表
void LinkList_destroy(LinkList heard){
    Node *current = heard;
    Node *next;
    while(current != NULL)
    {
        next = current->next;
        free(current);
        current = next;
    }
}

三、单链表和顺序表优缺点

单链表结构的优点是插入和删除操作效率高,时间复杂度为O(1);而缺点是访问元素时需要从头节点开始遍历,时间复杂度为O(n),并且需要额外的指针空间来存储下一个节点的地址。

顺序存储结构的优点是可以通过下标直接访问元素,查找效率高,时间复杂度为O(1);缺点是插入和删除操作效率较低,需要移动大量元素,时间复杂度为O(n),并且需要预先分配一定大小的存储空间。

在选择使用哪种结构时,需要根据实际的应用场景来进行权衡和选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1938022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机接Usb hub再连接电脑下D+D-波形

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

UE4-光照渲染、自动曝光、雾

目录 一.光源种类 二.灯光的移动性 三.自动曝光 四.指数级高度雾 五.实现光束 一.光源种类 1.定向光源 用来模拟现实中的太阳光。 2.点光源 比如现实中的灯泡 3.聚光源 4.矩形光源 是这几个光源中性能开销最大的&#xff0c;一般不用到游戏场景中&#xff0c;因为游…

win安装mysql

解压到目录没如果多个mysql创建不同的名字 创建data和my.ini my.ini内容 [client] default-character-setutf8mb4[mysqld] #设置3306端口 port 3306 # 设置mysql的安装目录 basedirF:\mysql-5.7.31 # 设置mysql的数据存放目录 datadirF:\mysql-5.7.31\data # 允许最大连接数 …

ComfyUI面部修复FaceDetailer使用指南

原文&#xff1a;ComfyUI面部修复完全指南 (chinaz.com) 让我们开始使用ComfyUI中的人脸详细修复器吧。人脸详细修复器节点乍一看可能很复杂&#xff0c;但不要担心&#xff0c;我们会一点一点地分解它。通过理解每个输入、输出和参数&#xff0c;你很快就能像专业人士一样使用…

处理AI模型中的“Type Mismatch”报错:数据类型转换技巧

处理AI模型中的“Type Mismatch”报错&#xff1a;数据类型转换技巧 &#x1f504; 处理AI模型中的“Type Mismatch”报错&#xff1a;数据类型转换技巧 &#x1f504;摘要引言正文内容1. 错误解析&#xff1a;什么是“Type Mismatch”&#xff1f;2. 数据类型转换技巧2.1 检查…

大数据环境下的房地产数据分析与预测研究的设计与实现

1绪论 1.1研究背景及意义 随着经济的快速发展和城市化进程的推进&#xff0c;房地产市场成为了国民经济的重要组成部分。在中国&#xff0c;房地产行业对经济增长、就业创造和资本投资起到了重要的支撑作用。作为中国西南地区的重要城市&#xff0c;昆明的房地产市场也备受关…

SwiftUI 在 WWDC 24 之后的新变化

文章目录 前言视图集合新的标签栏体验英雄动画滚动位置Entry 宏预览其他总结 前言 WWDC 24 已经到来&#xff0c;我们有很多内容要讨论。每年&#xff0c;SwiftUI 都会通过引入更多功能来赶上 UIKit。今年也不例外。让我们深入了解 SwiftUI 框架引入的新功能。 我首先要提到的…

JavaDS —— 优先级队列(堆) PriorityQueue

优先级队列的概念 我们在前面就已经学习过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;那么在该场景下&#xff0c;使…

详解数据结构之队列、循环队列(源码)

详解数据结构之队列、循环队列(源码) 队列属于线性表 队列&#xff1a;就好比如&#xff0c;我们在排队买东西时排队&#xff0c;第一个先来的第一个买&#xff0c;最后一个到的最后一个买&#xff0c;这里的队列也是满足先进先出&#xff0c;后进后出的规律&#xff08;First …

如果用MATLAB函数delayseq可以对分数延时,但是延时后波形较原波形有幅度上的改变

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

Adobe国际认证详解-视频设计认证专家行业应用场景解析

在当今数字化时代&#xff0c;视频设计已成为各行各业不可或缺的一环。而视频设计认证专家&#xff0c;作为经过Adobe国际认证体系严格考核的专业人才&#xff0c;更是行业内炙手可热的存在。他们凭借深厚的视频设计理论基础和实践经验&#xff0c;为行业提供了高质量的视频设计…

ROS2中间件

ROS2 是重新设计的 Robot Operating System&#xff0c;无论从用户API接口到底层实现都进行了改进。这里主要关注ROS2 的中间件。 1. 通信模式 ROS2 使用DDS协议进行数据传输&#xff0c;并通过抽象的rmw&#xff0c;支持多个厂家的DDS实现&#xff08;FastDDS&#xff0c;Cyc…

Django 执行原生SQL

在Django中&#xff0c;你可以使用Raw SQL queries来执行原生的SQL查询。这对于需要进行复杂查询或Django的ORM无法满足的查询非常有用。 1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_le…

arthas:介绍

文章目录 一、Arthas&#xff08;阿尔萨斯&#xff09;能为你做什么&#xff1f;二、运行环境要求三、快速安装四、卸载五、通过浏览器连接arthas 一、Arthas&#xff08;阿尔萨斯&#xff09;能为你做什么&#xff1f; Arthas是Alibaba开源的Java诊断工具&#xff0c;深受开发…

buu--web做题(4)

目录 [BJDCTF2020]ZJCTF&#xff0c;不过如此 [BUUCTF 2018]Online Tool [BJDCTF2020]ZJCTF&#xff0c;不过如此 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)&q…

vue3运行若依前后台项目步骤(2024-07-19)

环境配置 1、jdk > 1.8 (我的1.8&#xff09; 2、mysql >5.7 (我的5.8&#xff09; 3、navicat (数据库管理器&#xff0c;连接mysql使用 ,我的是15) 4、mysql&#xff08;数据库&#xff0c;我的5.0&#xff09; 4、npm (我的是18.20.0) 5、idea编辑器,webtorm &#x…

Unity UGUI 之 Graphic Raycaster

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 首先手册连接如下&#xff1a; Unity - Manual: Graphic Raycaster 笔记来源于&#xff…

Mike Ferguson:我在麻省理工学院人工智能研究实验室工作一年学到了 5 件事

Mike Ferguson &#xff0c;麻省理工学院大脑和认知科学系 (MIT BCS) 担任研究软件工程师 / ML 工程师。专门研究 Brain-Score&#xff08;一种衡量类脑 AI 的工具&#xff09;。他于 2021 年春季毕业于弗吉尼亚大学&#xff0c;获得计算机科学和应用数学学士学位&#xff0c;以…

【数字电路学习新助手】掌握电路仿真软件,开启数字电路知识的新篇章

在信息科技日新月异的今天&#xff0c;数字电路知识的重要性不言而喻。无论是通信工程、计算机科学与技术&#xff0c;还是电子信息技术等领域&#xff0c;数字电路都是基础中的基础。然而&#xff0c;对于初学者来说&#xff0c;数字电路的学习往往充满了挑战。幸运的是&#…

JUC 06 锁 开始

01.volatile 02.synchronized 03.lock