线性表的顺序表示和实现(严蔚敏版)
线性表的顺序表示和实现
- 定义变量
- 初始化线性表
- 插入元素
- 删除线性表中的元素
- 查询
- 输出线性表
- 合并两个表
- 逻辑运行(main)
- 后续
定义变量
#include<stdio.h> //输入输出头文件
#include<stdlib.h> //malloc和free都在这个头文件里
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//函数类型,其值是函数结果状态代码
typedef int ElemType;
#define maxList 10
ElemType* q;
ElemType* p;
ElemType* pa;
ElemType* pb;
ElemType* pc;
ElemType* pa_last;
ElemType* pb_last;
int i;
/******************元素类型*******************/
typedef struct {ElemType* elem;//存储空间基址,L.elem[5]为第六位的地址int length; //当前长度int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
初始化线性表
创建一个空表,并将length置零,初始化存储容量
Status InitList_Sq(SqList& L)
{//构建一个空的线性表LL.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));//给L分配一个地址if (!L.elem)exit(OVERFLOW); //exit函数是退出应用程序,并将应用程序的一个状态返回给OS//此句表示,如果分配失败,退出程序,返回值为OVERFLOW(-2)L.length = 0; //初始化长度为0L.listsize = LIST_INIT_SIZE; //初始存储容量return OK;//返回1
}
插入元素
顺序表插入元素即为在位置i处插入一个元素,将原来i位置之后的所有元素向后移一位。
可以很明显的看出,此时的时间复杂度是线性的。
/***********插入**************/
Status ListInsert_Sq(SqList& L, int i, ElemType e)
{ElemType* newbase;//在顺序表L中插入第i个位置之前插入新的元素e//i的合法性 0<i<ListLength.Sq(L)+1 //ListLength.Sq(表长)if (i<1 || i>L.length + 1)return ERROR;//i不合法/*当前存储空间已满,增加分配*/if (L.length >= L.listsize){newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));/*先释放原来L.elem所指内存区域,并重新分配大小为(L.listsize+LISTINCREMENT)*sizeof(ElemType)同时将原有数据从头到尾拷贝到新分配的内存区域,并返回该内存区域的首地址。*/if (!newbase)exit(OVERFLOW); //此句表示,如果分配失败,退出程序,返回值为OVERFLOW(-2)L.elem = newbase; //新基址L.listsize += LISTINCREMENT; //增加存储容量}q = &(L.elem[i - 1]); //q为插入位置for (p = &(L.elem[L.length - 1]); p >= q; --p)*(p + 1) = *p; //插入位置及向后的元素右移*q = e; //插入e++L.length; //表长+1return OK;}
删除线性表中的元素
在顺序表中,删除一个元素和插入一个元素的操作非常相似。删除一个元素即是将i位置之后的所有元素向前移一位。
在顺序存储结构中,插入或者删除一个元素,平均移动线性表中一半元素,时间复杂度均是O(n)。
/**************************删除第i个元素********************************/
Status ListDelete_Sq(SqList& L, int i, ElemType& e)
{//在顺序表中删除第i个元素,并用e返回其值//i的合法性,0<i<L.ListLength.Sq(L)if ((i < 1) || (i > L.length))return ERROR;p = &(L.elem[i - 1]); //p取地址为被删除的i元素的位置e = *p; //被删除的元素值赋给eq = L.elem + L.length - 1; //表尾元素的位置for (++p; p <= q; ++p) //被删除元素之后的元素左移*(p - 1) = *p;--L.length; //表长 -1return OK;}
查询
查询某个值在顺序表中是否存在,存在时,其位置是多少,其实就是将顺序表从第一个元素开始依次和这个值相比较。最多比较length次,最少比较一次。(表非空的情况下)
/*************************在顺序表中查询是否存在和e相同的元素**********************/
int locateElem_Sq(SqList L, ElemType e)
{//若找到,则返回其在L中的位序,否则返回0i = 1; //i的初值为第1个元素的位序p = L.elem; //p的初值为第1个元素的存储位置while (i <= L.length && *p++!=e)i++;if (i <= L.length)return i;elsereturn 0;
}
输出线性表
void PrintList_sq(SqList L)//输出顺序表中的元素
{int i;for (i = 0; i <L.length; i++)printf("%d ",L.elem[i]);printf("\n");
}
合并两个表
将两个表合并,首先开辟可以存放合并两个表需要的空间。之后依次比较两个表的元素的大小,将小的先存放,之后继续进行比较,直到其中一个表的元素存放完,将另一个表剩余的元素都依次存放进表3中。
void MergeList_Sq(SqList La, SqList Lb, SqList& Lc)
{//已知顺序表La和Lb的元素按值非递减排列//归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减排列pa = La.elem;pb = Lb.elem;Lc.listsize = Lc.length = La.length + Lb.length;//Lc的表长为La+Lbpc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));//给pc分配空间if (!Lc.elem)exit(OVERFLOW);//存储分配失败pa_last = La.elem + La.length - 1;//最后一个元素的位置pb_last = Lb.elem + Lb.length - 1;while (pa <= pa_last && pb <= pb_last)//当pa和pb没有超出相应的表时{//归并//*pa指针存储值//&pa指针地址if (*pa <= *pb) //当pa<=pb时,pc赋给pa并且两个指针+1 *pc++ = *pa++;else*pc++ = *pb++;}//当表的长度不一样时,插入剩余的部分while (pa <= pa_last)*pc++ = *pa++; //插入La的剩余元素while (pb <= pb_last)*pc++ = *pb++; //插入Lb的剩余元素}
逻辑运行(main)
int main()
{int options;SqList p;SqList q;int n;int e;int a[maxList];InitList_Sq(p);//初始化顺序表printf("请输入你要创建的元素个数:\n");scanf("%d", &n);//不能超过maxListfor (int i = 1; i <= n; i++){printf("请输入第%d个元素值\n", i);scanf("%d", &a[i]);ListInsert_Sq(p, i, a[i]);}PrintList_sq(p);int status1 = 1;while (status1){printf("请输入你要进行的操作:1、插入;2、删除;3、查询;4、退出\n");scanf("%d", &options);switch (options){case 1://{printf("请输入你要存放的位置\n");scanf("%d", &i);printf("请输入你要插入的元素值\n");scanf("%d", &e);ListInsert_Sq(p, i, e);PrintList_sq(p);//}break;case 2:printf("请输入你要删除的位置\n");scanf("%d", &i);ListDelete_Sq(p, i, e);printf("删除%d成功\n", e);PrintList_sq(p);break;case 3:printf("请输入你要查询的值\n");scanf("%d", &e);i = locateElem_Sq(p, e);if (i != 0)printf("此值的位置为:%d\n", i);elseprintf("没有此值\n");PrintList_sq(p);break;case 4:exit(0);default:printf("\t错误\n"); exit(0);PrintList_sq(p); break;}}printf("%d\n",p.length);return 0;
}
后续
如果想了解更多物联网、智能家居项目知识,可以关注我的程序设计专栏。
或者关注公众号。
编写不易,感谢支持。
线性表的顺序表示和实现(严蔚敏版)相关推荐
- 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...
1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...
- 数据结构-线性表的顺序结构
1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typedef int ElemType; //线性表存储基本类型 ...
- 02_线性表的顺序表示和实现
版权声明:本文为博主原创文章,未经博主允许不得转载 是时候重新系统的学习/复习一遍<数据结构>了!教材用的是清华出版社严蔚敏的<数据结构>,但众所周知,这本教材中给出的都是伪C ...
- 数据结构源码笔记(C语言):线性表的顺序表示
/* SeqList.c*/ /*线性表的顺序表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...
- 四、【线性表】线性表的顺序表示和实现
线性表的顺序表示和实现 前文我们提到过线性表是逻辑结构,只说明了数据元素之间的相互关系,想要使用线性表,我们还需要在计算机上表示出这些数据元素以及元素之间的关系.而对于同一种逻辑结构,可以有多种存储结 ...
- c语言建立线性表(顺序储存,链式储存,循环,双向)全
c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...
- mysql 线性表_数据结构-线性表之顺序表
线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...
- 数据结构——绪论以及线性表的顺序表示
绪论 数据类型 数据类型是一个值的集合和定义在此集合上一组操作的总称. (1)原子类型:其值不可再分的数据类型,如int,char,float. (2)结构类型:其值可以再分解为若干成分的数据类型. ...
- 数据结构(2) -- 线性表的顺序表示
2.2 线性表的顺序表示 顺序表基本操作: 插入操作:最坏情况O(n),最好情况O(1),平均情况O(n) 删除操作:最坏情况O(n),最好情况O(1),平均情况O(n) 按值查找:最坏情况O(n), ...
最新文章
- 4、题目要求:读入N名学生的成绩,将获得某一给定分数的学生人数输出。 * * 	输入格式:测试输入包含若干测试用例,每个测试用例的格式为 	第1行:N 	第2行:N名学生的成绩,相邻两数字用一个
- Xcode 7错误:“缺少iOS分发签名身份...”
- 扩频技术matlab仿真,基于Simulink的扩频通信仿真
- PHP 实现移除数组中项目为空的元素或为某值的元素
- Java 7:使用NIO.2进行文件过滤-第1部分
- WPF DataGrid
- MyBaits resultMap 返回值与对象不匹配处理
- flex 错误信息类型及解决方法
- Java基础教程汇总
- 安卓udp发包工具_网络发包工具_xcap网络发包工具免费版V1.0.2下载(暂未上线)_预约_飞翔下载...
- Java实现DFA算法敏感词过滤
- MySQL统计每月数量并计算同比增长率
- LONG RAW转换BLOB
- 8x能不能升级鸿蒙,华为没有忘记老用户,畅享系列升级鸿蒙OS,荣耀8X在列
- TP50 TP90 TP95 TP99 TP999 TP9999
- 联通数科一面+二面+面谈 经验分享 base济南
- MySQL innodb引擎,事务提交 commit 异常,但数据提交成功
- 51单片机自学--改造我的机器
- DWL-2100AP 默认登录帐号密码
- 解决labelimg闪退
热门文章
- java后台传一个对象到前台_前台判断对象中的一个布尔值_前后台分离的项目中,如何优雅的传输boolean类型的参数...
- mysql 不能定义用户变量名_mysql 变量名称的使用不当的一个错误
- codeforces 536a//Tavas and Karafs// Codeforces Round #299(Div. 1)
- python朋友圈切图代码
- apache开启虚拟主机localhost无法访问
- connect: Address is invalid on local machine or port is not valid on remote
- vue中的v-text指令之Vue知识点归纳(二)
- 音频编码:ADPCM
- rocketMQ基本架构简介
- 第2小节,深入剖析gym环境构建