Chp2-1 线性表
线性表的定义
注:数据结构三要素一一逻辑结构、数据的运算、存储结构(物理结构);储存的方式不同,运算实现的方式不同
小节回顾
chp2-2顺序表
定义
顺序表一一用顺序存储(一般使用数组)的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理
位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。而在数组分配上又可再进一步的分为动态数组分配与静态数组分配。
顺序表的特点
小节总结
2-2.1实现–静态\动态数组分配
代码实现
#include<stdio.h>
#include<stdlib.h>#define MaxiSize 10 //默认顺序表的最大长度//使用静态数组分配顺序表
/* Static Arrays*/
typedef struct SAList
{int data[MaxiSize]; //使用静态数组存放数据int length; //顺序表当前长度
} SASqList; //顺序表的定义(静态分配方式)//使用动态分配顺序表
/* Malloc Arrays*/
typedef struct MAList
{int *data; //指示动态分配数组的指针int MaxSize; //顺序表的最大容量int length; //顺序表的当前长度
}MASqList;//静态数组顺序表初始化函数
void SAInitList(SASqList *L){printf("<-------静态顺序表初始化函数------->\n");for (int i = 0; i < MaxiSize; i++){//全部数组赋初值为0L->data[i] = 0;}//顺序表初始长度为0L->length = 0;printf("<-------静态顺序表初始化结束------->\n");
}void MAInitList(MASqList *L){printf("<-------动态顺序表初始化函数------->\n");//用malloc申请一片连续的数组空间L->data = (int *)malloc(MaxiSize * sizeof(int));//顺序表初始长度为0L->length = 0;L->MaxSize = MaxiSize;printf("<-------静态顺序表初始化结束------->\n");
}void MAIncreaseSize(MASqList *L,int len){int *p = L->data; //用一个指针暂存当前顺序表的数组指针//重新给L顺序表分配空间(变大了)L->data = (int *)malloc((L->MaxSize + len) * sizeof(int));for (int i = 0; i < L->MaxSize; i++){L->data[i] = p[i]; //将原来L顺序表中的元素赋值到新的区域}L->MaxSize = L->MaxSize + len; //顺序表最大长度增加 lenfree(p); //释放原来的内存空间
}int main(){SASqList SAL; //声明一个静态顺序表SAInitList(&SAL); //初始化静态顺序表MASqList MAL; //声明一个动态顺序表MAInitList(&MAL);return 0;
}
2-2.2顺序表的基本功能–插入
功能代码是在静态分配方式下实现的,动态分配也雷同
代码实现
/** 静态顺序表的插入 在L的位序 i 处插入元素 e* @param L 需要操作的链表* @param i 需要插入的位置(表L中第i个位置对应于下标i-1)* @param e 需要插入的元素* 这里需要注意的是,最后e应该放到 i -1 = 2 的数组下标位置* 如 i = 2 j最后一进入 for 循环值为 2 则data[2] = data[1]* 0 1 2 3 4 5 index* 3 5 7 9 0 values* 3 5 5 7 9 0 将 下标>=1的元素全部后移一位* 3 e 5 7 9 0 将元素放置i-1=1处*/
bool SAListInsert(SASqList *L,int i,int e){if(i<1||i>(L->length)+1) //判断 i 的合法性return false;if(L->length>=MaxiSize) //如果空间已满则也不能插入return false;//将第 i 个元素及之后的元素后移for (int j = L->length; j >= i; j--){L->data[j] = L->data[j - 1];}L->data[i - 1] = e; //在位序 i 处放入eL->length++; //长度+1return true;
}
时间复杂度分析
2-2.3顺序表的基本功能–删除
代码实现
/** 静态顺序表的删除 将L的位序为 i 的元素删除 并将其赋至e*@param L 需要操作的表@param i 需要删除的位序@param e 对应为删除的元素带回来* 如 i = 2* 有 e = data[1] =5* j第一轮进入 for 循环值为 i=2 则data[1] = data[2]* j最后一进入 for 循环值为 length-1=5-1=4 则data[3] = data[4]* 0 1 2 3 4 5 index* 3 5 7 9 0 values* 3 7 9 0 0 将 下标>=2的元素全部前移一位* */
bool SAListDelete(SASqList *L,int i , int *e){if(i<1||i>L->length) //判断 i 的合法性return false;*e = L->data[i-1]; //将需要删除的元素的值赋到efor (int j = i; j < L->length;j++){L->data[j - 1] = L->data[j]; //将第 i 各位之后的元素前移}L->length--; //线性表长度-1return true;
}
时间复杂度分析
小节总结
2-2.4顺序表的查找
按位查找
代码实现
/** 获取链表L中位序为 i 的元素* @param L 需要操作的链表* @param i 需要取值的位序* */
int SAGetElem(SASqList *L,int i ){if(i<1||i>L->length) //判断位序的合法性return -1;return L->data[i - 1]; //与数组的使用无异
}
时间复杂度
按值查找
代码实现
/** 按值查找 在顺序表中获取值 e 第一次出现的位序* @param L 需要操作的链表* @param e 需要查询的数值* */
int SALocateElem(SASqList *L,int e){for (int i = 0; i < L->data;I++){if(L->data[i]==e) //如果匹配到对应的值return i + 1; //范围对应的位序}return -1; //如果没有查询到,则返回-1
}
时间复杂度
Chp2-1 线性表相关推荐
- 数据结构与算法——线性结构——线性表及其表示
-"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...
- 数据结构-线性表的顺序结构
1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typedef int ElemType; //线性表存储基本类型 ...
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
- 数据结构和算法:(3)3.1线性表的顺序存储结构
-----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...
- 数据结构与算法(2-1)线性表之顺序存储(顺序表)
顺序表用数组存储数据元素(可以是结构体数组,也可以是结构体内的元素数组),插入和删除等等也是类似数组的操作. 顺序表优势: 1.无须为表示表中元素之间的逻辑关系而增加额外的存储关系,就是直接的顺序: ...
- c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用
一元多项式的加法减法乘法 --(c语言描述)线性表应用 来源:永远的北邮人 vc6.0下调试通过 #include #include #include #include #include #inclu ...
- 线性表List的基本创建
#include <iostream> using namespace std; #include <malloc.h> #include <stdio.h> #d ...
- 数据结构之【线性表】(顺序表、链表的基本操作实现)
概念 线性表:是N个数据元素的有限序列. 顺序表:用一组地址连续的存储单元依次存储[线性表 ]的数据元素.(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储[线性 ...
- 线性表之顺序表(C语言实现)
线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一 ...
- 带头结点的线性表的链式实现
复习了顺序实现后,自己模仿着写了链式实现 /*** @author lirui 带头结点的线性表的链式实现*/ public class MyLinkList<T> {// 内部类LNod ...
最新文章
- 【Live555】live555源码详解(二):BasicHashTable、DelayQueue、HandlerSet
- 【计算几何】多边形交集
- 今天终于将第一个 Android NDK 程序编译、运行成功
- JVM调优:图解对象内存分配过程
- 京东宣布收购拇指阅读,具体金额未披露
- [SDOI2012]吊灯(结论)
- jzoj6311-Mobitel【dp,整除分块】
- js合并同类数组里面的对象_通过同类群组保留估算客户生命周期价值
- 惠普服务器查看主板型号,win10惠普主板型号查看图文教程
- Tomcat发布项目时,更改浏览器地址栏图标
- 读文献--《机器学习隐私保护研究综述》
- 数据哪里找?200个源数据网站全给你!
- PdgCntEditor一键生成PDF书签目录
- 【QNX Hypervisor 2.2 用户手册】4 构建QNX Hypervisor系统
- Vue-cli 脚手架构建的项目使用echarts进行数据可视化
- 2021年道路运输企业主要负责人模拟考试题库及道路运输企业主要负责人实操考试视频
- 五大基本算法及其经典问题
- 用verilog语言编写交通灯程序
- 计算电费(厦大PAT)
- 2022年废纸价格预测
热门文章
- 如何搭建自己的深度学习工作站?
- [转载]吃什么鱼最健康?(图)
- 盲打练习的第一个良好
- 【C++】C++标准库之iomanip库(格式输入输出)
- 智能家居论文文献_智能家居控制系统界面设计结论与参考文献
- tenda服务器端口映射,腾达(Tenda)路由器端口映射设置教程 | 192路由网
- 英语题目作业(12)
- Principal Component Analysis(PCA)
- SUST-ACM-2019届暑期ACM集训热身赛(第二期)题解
- 零费用学习网络营销,小伙伴们惊呆了