老郭带你学数据结构(C语言系列)2-线性表之动态顺序表
一、基本概念:
线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,……an)。
线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系。
顺序存储表:线性表中的元素依次存放在一组地址连续的存储单元(数组)中。
存储特点:若已知首元素的起始地址a0和每个元素占用的空间m,则计算第i个元素的存储位置:ai = a0 + (i - 1)m。
顺序表的特征:(1)在逻辑上相邻的元素,在物理上也是相邻
(2)知道表中起始元素的地址,线性表中的任一个元素地址都可以确定,因此很容易实现对线性表中的元素的随机访问。
动态顺序表:动态存储分配方式实现
二、代码实现:
1)结构实现(行号是为了阅读和说明代码方便,请复制代码是忽略行号)
typedef int ElemType; //定义一种数据类型
#define INITSIZE 60 //定义一个动态表的初始化大小的值
typedef struct{ //封装了数据类型
ElemType *data;
int len;
int listSiz;
} SqList;
2)抽象数据类型(主要是为了说明定义的结构(本例中是顺序表)支持的运算操作,为了使用上的方便,建议使用头文件加实现的方式来运用,引入了bool变量,包含头文件stdbool.h)
void listInit(SqList *L); //表的初始化
bool listEmpty(SqList L); //判断表是否为空
bool listFull(SqList L); //判断表是否已满
void listCreate(SqList *L); //创建表
void listPrint(SqList L); //输出表的内容
void listDestroy(SqList *L); //表的销毁,涉及内存分配,因此必须free
void listInsert(SqList *L, int i, ElemType e); //在表中i的位置插入元素e
int listLength(SqList L); //获取表的长度
int listSerch(SqList L, ElemType e); //在表中查找元素e,返回其在表中的位置
ElemType listDelete(SqList *L, int i); //删除表中位置为i的元素,并返回删除元素的值
ElemType listVisit(SqList L, int i); //访问表中第i个元素,并返回元素的值
3)头文件实现
将1)和2)中的代码整合后,在第4行加上#ifndef SqList_H,在第42行加上#endif,实际项目中这样作是为了避免重复定义和引用头文件,文件名为SqList.h,完整代码如下:
#include <stdbool.h>
typedef int ElemType;
#ifndef SqList_H
#define SqList_H
#define INITSIZE 60
typedef struct{
ElemType *data;
int len;
int listSiz;
} SqList;
void listInit(SqList *L); //表的初始化
bool listEmpty(SqList L); //判断表是否为空
bool listFull(SqList L); //判断表是否已满
void listCreate(SqList *L); //创建表
void listPrint(SqList L); //输出表的内容
void listDestroy(SqList *L); //表的销毁,涉及内存分配,因此必须free
void listInsert(SqList *L, int i, ElemType e); //在表中i的位置插入元素e
int listLength(SqList L); //获取表的长度
int listSerch(SqList L, ElemType e); //在表中查找元素e,返回其在表中的位置
ElemType listDelete(SqList *L, int i); //删除表中位置为i的元素,并返回删除元素的值
ElemType listVisit(SqList L, int i); //访问表中第i个元素,并返回元素的值
#endif
4)操作算法实现,实现头文件定义的顺序表的操作,文件名为SqList.c(注意头文件和和实现文件名字一模一样,只有后缀名由区别),具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include "SqList.h"
void listInit(SqList *L){
(*L).data = (ElemType *)malloc(sizeof(ElemType) * INITSIZE);
if(0 == (*L).data){
return;
}
(*L).len = 0;
(*L).listSize = INITSIZE;
}
bool listEmpty(SqList L){
return (0 == L.len);
}
bool listFull(SqList L){
return (listSize == L.len);
}
void listCreate(SqList *L){
printf("please input the lenth of list:");
scanf("%d", &((*L).len));
if((*L).len > (*L).listSize){
(*L).listSize = (*L).len + INITSIZE / 2;
free((*L).data);
(*L).data = (ElemType *)malloc(sizeof(ElemType) * (*L).listSize);
if(0 == (*L).data){
return;
}
}
for(int i = 0; i <= (*L).len; i++){
printf("please input NO%d element: ", i);
scanf("%d", &((*L).data[i]));
}
return;
}
void listPrint(SqList L){
for(int i = 0; i < L.len; i++){
printf("%d\t", L.data[i]);
}
printf("\n");
return;
}
void listDestroy(SqList *L){
free((*L).data);
(*L).data = NULL;
(*L).len = 0;
(*L).listSize = 0;
return;
}
void listInsert(SqList *L, int i, ElemType e){
if(i < 0 || i > (*L).len){
return;
}
if(listFull(*L)){
(*L).listSize = (*L).listSize + INITSIZE / 2;
(*L).data = (ElemType *)realloc(sizeof(ElemType) * (*L).listSize);
if(0 == (*L).data){
return;
}
}
for(int j = (*L).len - 1; j >= i - 1; j--){
(*L).data[j + 1] = (*L).data[j];
}
(*L).data[i - 1] = e;
(*L).len++;
return;
}
int listLength(SqList L){
return L.len;
}
int listSerch(SqList L, ElemType e){
for(int i = 0; i < L.len; i++){
if(e == L.data[i]){
return i;
}
}
return -1;
}
int listDelete(SqList *L, int i){
if(i < 0 || i > (*L).len){
return -1;
}
if(listEmpty(*L)){
return -2;
}
ElemType e = (*L).data[i - 1];
for(int j = i; j < (*L).len; j++){
(*L).data[j - 1] = (*L).data[j]
}
(*L).len--;
老郭带你学数据结构(C语言系列)2-线性表之动态顺序表的更多相关文章
- 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表
在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...
- 老段带你学鸟哥Linux视频教程 包含基础班+提高班
老段带你学鸟哥Linux视频教程 包含基础班+提高班,附带pdf文档. 目录结构如下: 目录:/-老段带你学鸟哥Linux视频教程 [.9G] ┣━━老段带你学鸟哥-服务器篇 [1009.4M] ┃ ...
- 数据结构C语言版--动态顺序表的基本功能实现(二)
/* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...
- PHP数据结构之二 线性表中的顺序表的PHP实现
线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- 数据结构C语言版干货------->线性表之顺序表
一:头文件定义 /*************************************************************************** *项目 数据结构 *概要 逻辑 ...
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...
- 《鸟哥Linux私房菜》 全套视频和PDF资料—— 老段带你学鸟哥Linux视频课程
<鸟哥的Linux私房菜-基础篇-服务器篇(第三版)>学习Linux极为经典的入门资料,但是还是很多同学难以坚持系统的看完整本书,最终以放弃而告终. 为了帮助大家更容易入门Linux,老段 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(6)动态内存分配
一.传统数组的缺点: 1.数组的长度必须事先定制,且只能是常整数,不能是变量 int len = 5; int a[len]; //error 2.传统形式定义的数组,该程序的内存程序员无法手动释放 ...
随机推荐
- 学习python第二天 流程判断
while循环age_of_Jim = 56 count = 0 #开始计数while True: #循环代码 if count ==3:#如果次数=3 break#退出 guess_age = in ...
- linux的发展过程
1. 操作系统 人与计算机硬件直接的中介 2. Linux系统组成 3. Linux的发展过程 蛋-人-人-人 unix于诞生贝尔实验室 人-谭教授 谭宁邦 minix mini unix. 主要用于 ...
- Harbor HA部署-使用Ceph RADOS后端
1. 前言 Harbor 1.4.0版本开始提供了HA部署方式,和非HA的主要区别就是把有状态的服务分离出来,使用外部集群,而不是运行在本地的容器上.而无状态的服务则可以部署在多个节点上,通过配置上层 ...
- 笔记-python-lib-re
笔记-python-lib-re 1. re模块简介 re模块提供了与perl类似的正则匹配功能. 要搜索的模式和字符串都可以是Unicode字符串(str)以及8位字符串(bytes).但 ...
- 笔记-算法-hash以及hashlib使用
算法-hash和hash表以及hashlib使用 1. 简介 1.1. hash Hash(散列/哈希),就是把任意长度的输入(预映射pre-image)通过散列算法变换成固定长度的输 ...
- java中如何判断一个字符串是否包含另外一个字符串的方法
indexOf(String s)的使用,如果包含,返回的值是包含该子字符串在父类字符串中起始位置: 如果不包含必定全部返回值为-1 package my_automation; public cla ...
- 「微信小程序免费辅导教程」25,基本内容组件text的使用及个人帐号允许的服务类目
- TCP/IP网络编程之基于TCP的服务端/客户端(二)
回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...
- pycharm中某些方法被标黄的原因及解决办法
在编辑python文件时,会遇到上图所示,函数方法被标黄的问题,但是不影响使用. 引起原因:,如果不报错说明,这是因为你配置的python解释器中有该方法,但是pycharm没有找到这个方法,即加载失 ...
- synchronized同步方法和同步代码块的区别
同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不是整个方法. 同步方法使用synchronized修 ...