C语言《数据结构》(朱战立):顺序表与链表

2023-11-09

数据结构:顺序表与链表

线性结构的特点是:除第一个和最后一个元素外,每个元素只有一个前驱数据元素和一个后继数据元素。线性表是一种可以在任意位置进行插入和删除数据元素操作的、由n(n≥0)个相同类型数据元素a0,a1,a2,…,an-1组成的线性结构。线性表有两种存储结构,一种是顺序存储结构,一种是链式存储结构。

一、顺序表

1、存储结构

typedef struct{
    Datatype list[MaxSize];
    int size;
}SeqList;

说明:建立一个数组list用来存储数据,size表示存入数据的数量

2、操作实现

① 初始化
void ListInitiate(L){
    L->size = 0;
}

说明:初始化size的值为0

② 插入数据元素
int ListInsert(SeqList *L,int i,DataType x){
    int j;
    if(L->size >= MaxSize){
        print("顺序表已满无法插入");
        return 0;
    }
    else if(i<0 || i>L->size){
        printf("参数i不合法");
        return 0;
    }
    else{
        for(j=L->size;j>i;j--)
            L->list[j]=L->list[j-1];
        L->list[i]=x;
        L->size++;
        return 1
    }
}      

说明:通过for循环,将要插入位置i的后面元素向后移动,腾出空间,然后给i处赋值x

③ 删除元素数据
int ListDelete(SeqList *L,int i,DataType){
    int j;
    if(L->size<=0){
        print("顺序表已空");
        return 0;
    }
        else if(i<0 || i>L->size){
        printf("参数i不合法");
        return 0;
    }
    else{
        *x = L->List[i];
        for(j=i+1;j<=L-size-1;j++)
            L->list[j-1]=L->list[j];
        L->size--;
        return 1;
    }
}

说明:通过for循环,将i之后的元素全部向前移动一个单位

④ 取数据元素
int ListGet(SeqList L,int i,DataType *x){
    if(i<0 || i>L->size){
        printf("参数i不合法");
        return 0;
    }
    else{
        *x = L.list[i];
        return 1;
    }
}
⑤ 求当前存储元素个数
int ListLength(SeqList *L){
    return L.size;
}

二、单链表

1、存储结构

typedef struct Node{
    DataType data;
    struct Node *next;
}SLNode;

说明:单链表由一个一个结点连接形成,其中data用于存放数据,next用于存放下一个结点的地址

2、操作实现

① 初始化
void ListInitiate(SLNode **head){
    *head = (SLNode *)malloc(sizeof(SLNode));
    (*head)->next = NULL;
}

说明:在初始化之前头指针没有具体的地址值,初始化指针,则需要存入指针的指针,这样*head才能操作头指针,给头指针进行malloc初始化,并初始化头指针的下一个结点为NULL

② 插入元素
int ListInsert(SLNode *head,int i,DataType x){
    SLNode *p,*q;
    int j;
    p = head;
    j=-1;
    while(p->next != NULL && j<i-1){
        p = p->next;
        j++;
    }
    if(j!=i-1){
        printf("插入元素位置参数出错");
        return 0;
    }
    q = (SLNode *)malloc(sizeof(SLNode));
    q->data = x;
    q->next = p->next;
    p->next = q;
    return 1;
}

说明:借助p临时指针作为辅助指针,通过p去遍历单链表,找到链表的尾部(即next为NULL的结点),然后借助q临时指针去存入要存放的元素,将p的next赋值给q的next,即是q->next赋值为NULL,然后将q赋值给p->next

③ 删除元素
int ListDelete(SLNode *head,int i,DataType *x){
    SLNode *p,*s;
    int j;
    p = haed;
    j = -1;
    while(p->next != NULL && p->next->next != NULL && j<i-1){
        p = p->next;
        j++;
    }
    if(j!=i-1){
        print("删除位置参数出错");
            return 0;
    }
    s = p->next;
    *x = s->data;
    p->next = p->next->next;
    free(s);
    return 1;
}

说明:删除元素只要找到i所在的位置即可,找到位置以后让p->next连接它下一个结点的next,则中间结点自动脱离链表,通过free去释放它的内存即可。

④ 取数据元素
int ListGet(SLNode *head,int i,DataType *x){
        SLNode *p;
        int j;
        p = head;
        j=-1;
        while(p->next != NULL && j<i){
            p=p->next;
            j++
        }
        if(j!=i){
            print("取值出错");
            return 0;
        }
        *x = p->data;
        return 1;
    }
⑤ 撤销单链表
void Destroy(SLNode **head){
    SLNode *p,*p1;
    p=*head;
    while(p!=NULL){
        p1=p;
        p=p->next;
        free(p1);
    }
    *head = NULL;
}

说明:c语言没有java的自动垃圾回收机制,我们的结点空间是动态申请的,所以需要手动释放申请的内存空间。

三、循环单链表

两处改动即可实现

① 初始化函数
(*head)->next=NULL;

改为

(*head)->next=*head;
② 在其它函数中

改变判断条件

p->next != NULL;
p->next->next != NULL;

改为

p->next != head;
p->next->next != head;

四、双向链表

1、存储结构

typedef struct Node{
    DataType data;
    struct Node *next;
    struct Node *prior;
}DLNode;

2、操作实现

① 初始化
void ListInitiate(DLNOde **head){
    *head = (DLNode *)malloc(sizeof(DLNode));
    (*head)->prior = *head;
    (*head)->next = *head;
}
② 插入数据
int ListInsert(DLNode *head,int i,DataType x){
    DLNode *p,*s;
    int j;
    p = head->next;
    j=0;
    while(p!=head && j<i){
        p=p->next;
        j++;
    }
    if(j!=i){
        print("输入出错");
        return 0;
    }
    s = (DLNode *)malloc(sizeof(DLNode));
    s->data = x;
    s->prior = p->prior;
    p->prior->next=s;
    s->next = p;
    p->prior = s;
    return 1;
}
③ 删除数据
int ListDelete(DLNode *head,int i,DataType *x){
    DLNode *p;
    int j;
    p=head->next;
    j=0;
    while(p->next!=head && j<i){
        p = p->next;
        j++;
    }
    if(j!=i){
        print("删除元素位置参数出错");
        return 0;
    }
    *x = p->data;
    p->prior->next = p->next;
    p->next->prior = p->prior;
    free(p);
    return 1;
}

说明:让前驱节点的next去连接该节点的next,让该结点next的前驱结点连接到该结点的前驱节点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言《数据结构》(朱战立):顺序表与链表 的相关文章

随机推荐

  • PCL 查看点云数据中包含的属性信息

    目录 一 概述 1 主要函数 2 算法源码 二 代码实现 三 结果展示 一 概述 PCL中自带的调用函数可直接查看点云数据中包含的有效属性信息 如RGB XYZ 法向量等 以下代码展示如何进行获取 1 主要函数 pcl getFieldsL
  • Github标星超级牛,免费又好用的Redis客户端工具!

    RedisDesktopManager 以前一直使用的是RedisDesktopManager这款Redis客户端工具 由于很久 这个工具大家相对不陌生了 也很多人都使用过了 RedisLettuceClient 他的界面这样 熟悉不 而且
  • 嵌入式CGI开发之旅——CGI环境变量

    嵌入式CGI开发之旅 CGI环境变量 WEB服务器和CGI FastCGI程序之间交流信息的主要途径是环境变量 以及标准输入输出流 这里说的环境变量是指操作系统中的环境变量 windows系统下 PATH是很常见的一个环境变量 CGI规范对
  • [高光谱]PyTorch使用CNN对高光谱图像进行分类

    项目原地址 Hyperspectral Classificationhttps github com eecn Hyperspectral ClassificationDataLoader讲解 高光谱 使用PyTorch的dataloade
  • Android:ViewPager2

    简介 ViewPager2内部使用RecyclerView实现 并提供了增强功能 特性 支持水平 垂直方向布局 android orientation vertical 支持从右到左 android layoutDirection rtl
  • pysot-master-train.py 运行记录

    pysot master training dataset coco readme md 根据readme进行操作 先下载coco数据集压缩包 解压 cd pycocotools make cd 这一步必须执行 先将连个py文件中的路径 d
  • Redis有哪些慢操作

    redis 数据类型与底层数据结构的关系 可以看到 String 类型的底层实现只有一种数据结构 也就是简单动态字符串 而 List Hash Set 和 Sorted Set 这四种数据类型 都有两种底层实现结构 通常情况下 我们会把这四
  • linux下恢复win10启动,重装win10后原来的ubuntu系统启动项丢失恢复方式

    windows系统在重装的时候总是把MBR重写了 重装windows后无法找到ubuntu的引导 然后插上你制作好的U盘 重启电脑 当然你得先设置好你得电脑首先是从你得U盘启动 如何设置 请按自己电脑的型号自己百度 进入U盘的ubnutu系
  • python使用pandas实现筛选功能方式

    1 筛选出数据的指定几行数据 data df loc 2 5 这里的 2 5 表示第3行到第5行内容 第一个起始是0 表示数据的第一行 2 筛选出数据某列为某值的所有数据记录 data df df 列名1 列值1 多条件匹配时 data m
  • UNIX网络编程卷一 学习笔记 第二十四章 带外数据

    许多传输层都有带外数据 out of band data 的概念 它有时也称为经加速数据 expedited data 其想法是一个连接的某端发生了重要的事情 且该端希望迅速通告其对端 这里的迅速指这种通知应该在已经排队等待发送的任何普通
  • PowerDesigner书签(02)导入SQL脚本生成ER图

    楔子 那时你很喜欢她吧 你不是觉得非她莫属 才跟她结婚的吗 同理 你现在痴迷的这个女人也没什么特别的 所谓的非她莫属从一开始就不存在 世上根本没有姻缘的红线 东野圭吾 黎明之街 1 今日书签 PowerDesigner 16 5 导入现有本
  • springBoot 跨域/文件上传/邮件

    学习目标 跨域请求 文件上传 邮件处理 跨域请求 1 跨域怎么理解 跨域是什么 跨域是指不同域名之间的相互访问 这是由浏览器的同源策略决定的 是浏览器对JavaScript施加的安全措施 防止恶意文件破坏 同源策略 同源策略是一种约定 它是
  • 主节点连接hiveserver2报错Error: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop01:10000:

    错误 Error Could not open client transport with JDBC Uri jdbc hive2 hadoop01 10000 java net ConnectException 拒绝连接 state 08
  • 自启exe_一个阻止【部分】流氓软件自启的解决办法(以AlibabaProtect.exe为例)

    警告 目前很多流氓软件已经采用了更高级的隐藏自己的方法 文中的方法仅限一些比较低级的顽固软件 笔者不保证文中方法能适用所有软件 如果不行请自行另找办法 这里只是提供一种思路 近日 笔者发现电脑里凭空多出一个占用闲置资源的AlibabaPro
  • sqli-labs通关全解---有关请求头注入--less18-22--7

    HTTP请求头我们可以通过chrome的F12开发者工具看到 一般的请求头内容如下 1 Accept Accept application json 浏览器可以接受服务器回发的类型为 application json Accept 代表浏览
  • sql字符串拼接

    1 概述 在SQL语句中经常需要进行字符串拼接 以sqlserver oracle mysql三种数据库为例 因为这三种数据库具有代表性 sqlserver select 123 456 oracle select 123 456 from
  • Mac电脑SecureCRT安装步骤

    Securecrt Mac版是Mac os系统上一款强大易用且专业的终端SSH工具 类似于Windows中的Putty SecureCRTpo解版支持SSH1 SSH2 Telnet等远程连接 同时具有很多实用和专业的辅助功能 支持保存mi
  • 01 如何学习Python Web开发从入门到实战

    Python Web开发从入门到实战 前言 Python Web是学校所学的课程 我希望在学习的同时通过写笔记的形式来记录我学习以及由学校学习转而自身对此方向感兴趣的一个过程 更多还是让自己在课程结束之后进行一个小的总结来回顾 提高自己 当
  • C# socket服务端判断 客户端已经断开连接的一个小办法

    具体原理就是 If the remote host shuts down the Socket connection with the Shutdown method and all available data has been rece
  • C语言《数据结构》(朱战立):顺序表与链表

    数据结构 顺序表与链表 线性结构的特点是 除第一个和最后一个元素外 每个元素只有一个前驱数据元素和一个后继数据元素 线性表是一种可以在任意位置进行插入和删除数据元素操作的 由n n 0 个相同类型数据元素a0 a1 a2 an 1组成的线性