数据结构----线性表顺序和链式结构的使用(c)
PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写好了,java还有三个特性,封装、继承、多态。当然这里不是讲Java,这里主要是说内部结构,大家都知道数据结构有些东西是分为逻辑结构和物理结构的,物理结构有分为顺序结构和链式结构,有不懂得可以百度百科,这里主要是分享线性表的顺序结构。那么什么是线性表呢,线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表
- 顺序表
- 链式表
1:顺序表分析
- 结构体创建
- 初始化顺序表
- 插入操作
- 删除操作
- 查找操作
- 修改操作
由于顺序表比较简单,这里解释都在代码中,在外就不在赘述。
1-1:结构体的创建
- #define ElemType int
- #define MAXSIZE 100 //定义变量不需要分号。
- //创建线性表
- typedef struct {
- ElemType elem[MAXSIZE];
- int length; //长度
- } SqList;
1-2:初始化顺序表
- int InitList(SqList &L) {
- // 初始化表,一个空表。
- L.length = ;
- return ;
- }
1-3:操作方法
- /**
- * @descibe 插入元素
- * @param L 线性表
- * @param pos 所在位置(并非角标)
- * @param data 插入元素
- * */
- int ListInsert(SqList &L, int pos, ElemType data) {
- if (pos < || pos > L.length + ) {
- printf("插入的不合法");
- return -;
- }
- int i;
- //在插入的同时,i要保证在pos以及pos后方,入1,2,3,4,5当在第3个插入时,须把原有的第三个数据以及以后数据后移一位,空出第三个位置。
- for (i = L.length; i >= pos; i--) {
- L.elem[i] = L.elem[i - ];
- }
- L.elem[pos - ] = data;
- L.length++;
- return ;//
- }
- /**
- * 线性表中删除操作
- * @param L 线性表
- * @param pos 所在位置(并非角标)
- * @param data 插入元素
- * */
- int ListDelete(SqList &L, int pos, int data) {
- if (pos < || pos > L.length) {
- printf("删除角标不合法");
- return -;
- }
- if (!(L.elem[pos - ] == data)) {
- printf("没有这个数字");
- return -;
- }
- int i;
- //在插入的同时,i要保证在pos以及pos后方,入1,2,3,4,5当在第3个插入时,须把原有的第三个数据以及以后数据后移一位,空出第三个位置。
- for (i = pos; i <= L.length; i++) {
- L.elem[i - ] = L.elem[i];
- }
- L.length--;
- return ;//返回0表示成功;
- }
- //查找数据
- int queryList(SqList L, int e) {
- //如果小于1证明没有数据,则直接返回。
- if (L.length < ) {
- printf("表中没有数据");
- return -;
- }
- for (int i = ; i < L.length; i++) {
- if (L.elem[i] == e) {
- printf("找到该数据:%d角标为:%d \n", L.elem[i], i);
- }
- }
- return ;
- }
- //修改数据
- int xiugai(SqList &L, int pos, int e) {
- if (pos < || pos > L.length) {
- printf("修改角标不合法");
- return -;
- }
- L.elem[pos - ] = e;
- return ;
- }
- //打印全部数据
- void PrintF(SqList L) {
- printf("打印表中所有元素\n");
- int i;
- for (i = ; i < L.length; i++) {
- printf("%d\n", L.elem[i]);
- }
- }
综上所述:线性表和之前的数组类似,很容易理解。在使用的过程记得声明一下方法(函数);
2:链表分析
- 结构体创建
- 初始化顺序表
- 插入操作
- 删除操作
- 查找操作
- 修改操作
需要注意的是这里的结构体需要一个指针,前一个结点的指针指向下一个结点,依次类推,最后一个指针指向NULL;
2-1:结构体创建
- /**
- * @describe 创建一个结构体
- * SLink *next指针;
- * *SLinkListL 创建一个结构体指针
- * */
- typedef struct SLink {
- int data;
- struct SLink *next;
- } SLink, *SLinkListL;
2-2:初始化链表
- /**
- * @describe 初始化链表
- * */
- SLinkListL initLinkL() {
- //1:分配一个空间
- SLinkListL sLinkListL = (SLinkListL) malloc(sizeof(SLink));
- //2:判断是否创建成功
- if (!sLinkListL) {
- exit(-);
- }
- sLinkListL->next = NULL;
- printf("初始化单链表成功\n");
- return sLinkListL;
- }
2-3:操作--增删该查
这里需要注意的是修改这个操作,找p的时候要找到要修改的p,而不是前一个结点,比如说,咱们在第二个位置插入的时候要找到第一个位置作为p,二修改的时候就要找到第二个位置,也就是说pos传值的时候不用减一。
- /**
- * @describe 插入操作
- *
- * @param L 链表类型
- * @param pos 插入位置
- * @param e 插入元素
- * */
- int insertLinkL(SLinkListL &L, int pos, int e) {
- SLinkListL p = L;
- //判断是否符合链表的长度;
- int i = ;
- //判断长度,寻找要插入的位置(前一位);
- while (p && i < pos-) {
- p = p->next;
- i++;
- }
- //判断长度是否超过pos
- if (!p || i > pos-) {
- return ;
- }
- //为新元素创建结点(分配空间)
- SLinkListL s = (SLinkListL) malloc(sizeof(SLink));
- s->data = e;
- s->next = p->next;
- p->next = s;
- return ;
- }
- /**
- * @describe 删除操作
- * @param L 链表类型
- * @param pos 删除位置
- * @param e 删除存放元素
- * */
- int deleteLinkL(SLinkListL &L, int pos, int *e) {
- SLinkListL p = L;
- //1:判断位置
- int i = ;
- while (p && i < pos-) {
- p = p->next;
- i++;
- }
- if (!p || i > pos-) {
- printf("删除位置不合法\n");
- return -;
- }
- //定义一个空的变量,用于存放p的指针,入a1,a2,a3,如果要删除a2,则p指向a1,此时,把a1的next先交给s(暂存,此时代表a2(因为a1的指针是指向a2)),然后用s去取下一个指针(next)就是a3,
- SLinkListL s;//s为了释放掉删除元素的空间
- s = p->next;
- p->next = s->next;
- *e = s->data;//暂存
- free(s);
- printf("删除成功\n");
- return ;
- }
- /**
- * @describe 查找操作
- * @param L:链表类型
- * @param e:e查找元素
- * */
- int queryLinkL(SLinkListL L, int e) {
- printf("查找元素为:%d",e);
- SLinkListL p = L;
- int i = ;
- while (p) {
- p = p->next;
- if (p->data == e) {
- printf("找到元素%d\n", i);
- return ;
- }
- i++;
- }
- printf("下标不合法/没有找到该数据");
- return -;
- }
- /**
- * @describe 修改操作
- * @param L:链表类型
- * @param i:修改元素的位置
- * @param e:修改元素值
- * */
- int updataLinkL(SLinkListL &L, int pos, int e) {
- printf("修改数据为第:%d 个,值为:%d\n",pos,e);
- SLinkListL p = L;
- int i = ;
- while (p && i < pos) {
- p = p->next;
- i++;
- }
- if (!p || i > pos) {
- printf("修改失败--原因:修改的下标越界\n");
- return -;
- }
- p->data = e;
- printf("修改成功\n");
- return ;
- }
- void printLL(SLinkListL L) {
- printf("打印全部数据\n");
- SLinkListL p = L->next;
- while (p) {
- printf("%d ", p->data);
- p = p->next;
- }
- printf("\n");
- }
综上所述:只多了一个指针,一开始看估计还有有看不懂的地方,按照顺序把代码粘贴到你编辑器上,运行起来慢慢看。
数据结构----线性表顺序和链式结构的使用(c)的更多相关文章
- [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...
- C语言 线性表 双向链式结构 实现
一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...
- C# 数据结构 线性表(顺序表 链表 IList 数组)
线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. ...
- C#实现数据结构——线性表(下)
线性表链式存储结构 看了线性表的顺序存储,你肯定想线性表简是挺简单,但是我一开始怎么会知道有多少人排队?要分配多大的数组?而且插入和删除一个元素也太麻烦了,所有元素都要前移/后移,效率又低. 那怎么办 ...
- C#实现数据结构——线性表(上)
什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...
- [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)
[数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构) C#中的链表(源码) 可空类 ...
- [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList
一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...
- 线性表——顺序表的实现与讲解(C++描述)
线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...
- C语言 严蔚敏数据结构 线性表之链表实现
博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直 ...
随机推荐
- NOI Linux学习
打开终端: cd (目录名)//进入该目录的终端 cd ..//退出该目录,返回上一层. 修改用户名 密码: 修改密码: passwd//直接修改root密码 passwd (用户名)//修改该用户的 ...
- 封装通用的xhr对象(兼容各个版本)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python - 斐波那契(Fibonacci)数列
斐波那契数列即数列中每一项等于它前面两项的和,公式如下: f(n) = f(n-1) + f(n-2) n>2 ----- 递推公式 f(n) = 1 ...
- 我的Python升级打怪之路【二】:Python的基本数据类型及操作
基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数是32位,取值范围是-2**31~2--31-1 在64位系统上,整数的位数是64位,取值范围是-2**63~2**63-1 clas ...
- Orcale 之子查询
子查询和连接查询一样,都提供了使用单个查询访问多个表中的数据的方法.子查询在其他查询的基础上,提供一种进一步有效的方式来访问数据. IN 关键字 使用 IN 关键字可以将原表中特定的的值与子查询中返回 ...
- 完美解决ExtJs6上传中文文件名乱码,后端SpringMVC
ExtJs上传中文文件名乱码,观察请求. ExtJs6上传乱码从后台无法解决,因为文件名请求里面就已经乱码了,后台无法解码. 除非请求参数正确没有乱码,后台因为编码设置不一样,可以通过后台处理乱码 这 ...
- xcode配置文件中,Architectures表示的意义
xcode配置文件中,Architectures表示的意义 ======================== Architecture : 指你想支持的指令集. Valid architectures ...
- OOP_由C到C++
由C到C++ OOP第一课 C语言的局限 C++的特点 C++的程序特征 C++程序的结构特性 C++程序的编辑.编译和运行 ⭐C++对C的补充 C语言的局限 类型检查机制相对较弱,使得程序中的一些错 ...
- sublime text 3 3143注册码
1.点击help->enter license: —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390 ...
- ServiceHelper
public class ServiceHelper { private static string _baseUrl = $@"http://{Config.Instance.MesSer ...