顺序表和链表(一)

目录

线性表

一、顺序表

<1>顺序表

(1)静态顺序表

(2)动态顺序表-按需申请

<2>链表

(1)单链表

(2)双链表

主程序(test.c)

头文件(DList.h)

调用函数程序(DList.c)


线性表

顺序表、链表、栈、队列、字符串

一、顺序表

连续的物理地址连续(依次)存储数据(数组)

<1>顺序表

(1)静态顺序表
#define N 10
typedef int SLDataType;struct SeqList
{SLDataType a[N];SLDataType size;
};

通讯录-C语言-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Xiaodao12345djs/article/details/142720466?spm=1001.2014.3001.5501这个通讯录就是静态通讯录,缺点很明显,提前开辟内存空间,很可能造成空间浪费

(2)动态顺序表-按需申请

动态顺序表存储数据时会调用函数来开辟动态内存,按需申请,空间利用率较高


#define NAME_MAX 10
#define SEX_MAX 5
#define Address_MAX 30
#define NUMBER_MAX 12
#define MAX 100#define DEFAUL_SZ 3
#define INC_SZ 2//联系人信息
typedef struct Message
{char name[NAME_MAX];int age;char sex[SEX_MAX];char address[Address_MAX];char number[NUMBER_MAX];
}Message;//联系人数量(动态)
typedef struct Contact
{Message* list;//指向存放人信息空间int num;//存放人信息的个数int capacity;//当前通信录最大容量
}Contact;

动态通讯录-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Xiaodao12345djs/article/details/142732433?spm=1001.2014.3001.5501

<2>链表

(1)单链表

学习链表首先要搞懂结构,物理结构是内存中数据实实在在的变化,为了方便理解,通常用逻辑结构,节点和节点的地址不一定是连续的,所以但单链表的节点中存储下一个节点的地址(指向下一个节点)

单链表的增删查改-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Xiaodao12345djs/article/details/143064430?spm=1001.2014.3001.5501

 一个数据存一个内存块中,用指针来链接

(2)双链表
主程序(test.c)
#define _CRT_SECURE_NO_WARNINGS 1
#include "DList.h"int main()
{//创建哨兵位及初始化ListNode* dlist = ListCreate();// 双向链表尾插ListPushBack(dlist, 1);ListPushBack(dlist, 2);ListPushBack(dlist, 3);ListPushBack(dlist, 4);ListPushBack(dlist, 5);ListPushBack(dlist, 6);//打印ListPrint(dlist);//尾删ListPopBack(dlist);ListPrint(dlist);//头插ListPushFront(dlist, 1);ListPrint(dlist);ListPushFront(dlist, 2);ListPrint(dlist);ListPushFront(dlist, 3);ListPrint(dlist);//头删ListPopFront(dlist);ListPopFront(dlist);ListPopFront(dlist);ListPrint(dlist);//查找ListNode* pos = ListFind(dlist, 1);//在pos前面插入xListInsert(pos, 2);ListPrint(dlist);//查找pos = ListFind(dlist, 2);// 双向链表删除pos位置的节点ListErase(pos);ListPrint(dlist);return 0;
}
头文件(DList.h)
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>// 带头+双向+循环链表增删查改实现
typedef int LTDataType;
typedef struct ListNode
{LTDataType _data;struct ListNode* _next;struct ListNode* _prev;
}ListNode;// 创建返回链表的头结点.
ListNode* ListCreate();
// 双向链表销毁
void ListDestory(ListNode* pHead);
// 双向链表打印
void ListPrint(ListNode* pHead);
// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x);
// 双向链表尾删
void ListPopBack(ListNode* pHead);
// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x);
// 双向链表头删
void ListPopFront(ListNode* pHead);
// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x);
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x);
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);
调用函数程序(DList.c)
#define _CRT_SECURE_NO_WARNINGS 1#include "DList.h"//创建新节点及申请空间
ListNode* Buynode(LTDataType x)
{ListNode* node = (ListNode*)malloc(sizeof(ListNode));if (node == NULL){perror("node:");}else{node->_data = x;node->_next = NULL;node->_prev = NULL;}return node;
}//创建哨兵位及初始化
ListNode* ListCreate()
{ListNode* newnode = Buynode(0);newnode->_next = newnode;newnode->_prev = newnode;return newnode;
}// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* newnode = Buynode(x);ListNode* tail = pHead->_prev;tail->_next = newnode;newnode->_prev = tail;newnode->_next = pHead;pHead->_prev = newnode;
}// 双向链表打印
void ListPrint(ListNode* pHead)
{assert(pHead);ListNode* tail = pHead->_next;printf("<= phead ");while (tail != pHead){printf("<=> %d ", tail->_data);tail = tail->_next;}printf("=>\n");
}// 双向链表尾删
void ListPopBack(ListNode* pHead)
{assert(pHead);if (pHead->_next == pHead){printf("链表为空,无法删除!!!\n");return;}ListNode* tail = pHead->_prev;ListNode* prevnode = tail->_prev;prevnode->_next = pHead;pHead->_prev = prevnode;free(tail);tail = NULL;
}// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* first = pHead->_next;ListNode* newnode = Buynode(x);newnode->_next = first;first->_prev = newnode;newnode->_prev = pHead;pHead->_next = newnode;
}// 双向链表头删
void ListPopFront(ListNode* pHead)
{assert(pHead);if (pHead->_next == pHead){printf("链表为空,无法删除!!!\n");return;}ListNode* first = pHead->_next;pHead->_next = first->_next;first->_next->_prev = pHead;free(first);first = NULL;}// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* scr = pHead->_next;while (scr != pHead){if (scr->_data == x){return scr;}scr = scr->_next;}return NULL;
}// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x)
{assert(pos);ListNode* prev = pos->_prev;ListNode* newnode = Buynode(x);newnode->_next = pos;pos->_prev = newnode;prev->_next = newnode;newnode->_prev = prev;
}// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{assert(pos);ListNode* prev = pos->_prev;ListNode* next = pos->_next;prev->_next = next;next->_prev = prev;free(pos);pos = NULL;
}

 双链表的结构体中定义了两个结构体指针,指向上一个节点和下一个节点,更方便增删查改

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

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

相关文章

# Ubuntu 达人九步养成记(1)

Ubuntu 达人九步养成记&#xff08;1&#xff09; 目录&#xff1a; 一、ubuntu基本安装 二、设置语言环境 三、设置服务器镜像源 四、在启动栏添加终端图标 五、使用apt更新和升级系统软件 六、使用apt安装软件 七、使用apt删除软件以及apt-get 八、deb格式及谷歌浏览…

QT——TCP网络调试助手

目录 一.项目展示 ​编辑 二.开发流程 三.QTcpServer、QTcpSocket、QUdpSocket类的学习 1.QTcpServer服务端 2.QTcpSocket客户端 3.Udp通信 四.网络调试助手 1.首先我们实现当用户选择不同协议类型时不同的UI组件如何切换 2.实现打开/关闭按键图片的切换 方式一&…

导航栏渐变色iOS

- (void)viewDidLoad {[super viewDidLoad];// 设置导航栏属性self.navigationBar.translucent NO;[self.navigationBar setTitleTextAttributes:{NSForegroundColorAttributeName : [UIColor whiteColor], NSFontAttributeName:[UIFont boldSystemFontOfSize:28]}];// 修复iO…

《Web性能权威指南》-浏览器API与协议-读书笔记

本文是《Web性能权威指南》第四部分——浏览器API与协议的读书笔记。 第一部分——网络技术概览&#xff0c;请参考网络技术概览&#xff1b; 第二部分——无线网络性能&#xff0c;请参考无线网络性能&#xff1b; 第三部分——HTTP&#xff0c;请参考HTTP。 浏览器网络概述 …

使用TypeORM进行数据库操作

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用TypeORM进行数据库操作 引言 TypeORM 简介 安装 TypeORM 配置 TypeORM 定义实体 连接数据库 运行项目 高级功能 事务管理 关…

ESP-HaloPanel:用 ESP32-C2 打造超低成本智能家居面板

项目简介 在生活品质日益提升的今天&#xff0c;智能家居系统已经走进了千家万户&#xff0c;并逐渐成为现代生活的一部份。与此同时&#xff0c;一款设计精致、体积轻盈、操作简便的全屋智能家居控制面板&#xff0c;已经成为众多家庭的新宠。这种高效、直观的智能化的解决方…

Hadoop生态圈框架部署(四)- Hadoop完全分布式部署

文章目录 前言一、Hadoop完全分布式部署&#xff08;手动部署&#xff09;1. 下载hadoop2. 上传安装包2. 解压hadoop安装包3. 配置hadoop配置文件3.1 虚拟机hadoop1修改hadoop配置文件3.1.1 修改 hadoop-env.sh 配置文件3.3.2 修改 core-site.xml 配置文件3.3.3 修改 hdfs-site…

数据建模圣经|数据模型资源手册卷3,数据建模最佳实践

简介 本书采用了类设计模式的方式对数据模型进行高度抽象总结&#xff0c;展现了常见的数据模型构建模型等模型的作用、层次、分类、地位、沟通方式&#xff0c;和业务规则。使用一个强大的数据模型模式的数据建模&#xff0c;评估特定与广义模型的优缺点&#xff0c;有助于你改…

【力扣】Go语言回溯算法详细实现与方法论提炼

文章目录 一、引言二、回溯算法的核心概念三、组合问题1. LeetCode 77. 组合2. LeetCode 216. 组合总和III3. LeetCode 17. 电话号码的字母组合4. LeetCode 39. 组合总和5. LeetCode 40. 组合总和 II小结 四、分割问题6. LeetCode 131. 分割回文串7. LeetCode 93. 复原IP地址小…

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶之Mongodb未授权访问

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Golang--流程控制

1、分支结构 1.1 if分支 单分支 语法&#xff1a;if 条件表达式 { 逻辑代码 } 当条件表达式为true时&#xff0c;就会执行代码块的代码。条件表达式左右的()可以不写&#xff0c;也建议不写 if和表达式中间&#xff0c;一定要有空格在Golang中&#xff0c;{}是必须有的,就算你…

【补补漏洞吧 | 02】等保测评ZooKeeperElasticsearch未授权访问漏洞补漏方法

一、项目背景 客户新系统上线&#xff0c;因为行业网络安全要求&#xff0c;需要做等保测评&#xff0c; 通过第三方漏扫工具扫描系统&#xff0c;漏扫报告显示ZooKeeper和 Elasticsearch 服务各拥有一个漏洞&#xff0c;具体结果如下&#xff1a; 1、ZooKeeper 未授权访问【…

Serverless + AI 让应用开发更简单

本文整理自 2024 云栖大会&#xff0c;阿里云智能高级技术专家&#xff0c;史明伟演讲议题《Serverless AI 让应用开发更简单》 随着云计算和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;企业对于高效、灵活且成本效益高的解决方案的需求日益增长。本文旨在…

从0开始学PHP面向对象内容之(类,对象,构造/析构函数)

上期我们讲了面向对象的一些基本信息&#xff0c;这期让我们详细的了解一下 一、面向对象—类 1、PHP类的定义语法&#xff1a; <?php class className {var $var1;var $var2 "constant string";function classfunc ($arg1, $arg2) {[..]}[..] } ?>2、解…

(八)JavaWeb后端开发——Tomcat

目录 1.Web服务器概念 2.tomcat 1.Web服务器概念 服务器&#xff1a;安装了服务器软件的计算机服务器软件&#xff1a;接收用户的请求&#xff0c;处理请求&#xff0c;做出响应web服务器软件&#xff1a;在web服务器软件中&#xff0c;可以部署web项目&#xff0c;让用户通…

【Linux系列】Linux 和 Unix 系统中的`set`命令与错误处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Nuxt.js 应用中的 nitro:config 事件钩子详解

title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲…

[论文阅读]LOGAN: Membership Inference Attacks Against Generative Models

LOGAN: Membership Inference Attacks Against Generative Models https://arxiv.org/abs/1705.07663v4 Proceedings on Privacy Enhancing Technologies &#xff08;PoPETs&#xff09;&#xff0c;第 2019 卷&#xff0c;第 1 期。 这篇文章是17年的一篇文章&#xff0c;…

使用Vite构建现代化前端应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Vite构建现代化前端应用 引言 Vite 简介 安装 Vite 创建项目 启动开发服务器 项目结构 配置 Vite 开发模式 生产构建 使用插…

Node.js:模块 包

Node.js&#xff1a;模块 & 包 模块module对象 包npm安装包配置文件镜像源 分类 模块 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 简单来说&#xff0c;就是把一个…