线性表的顺序表示和实现

  • 定义变量
  • 初始化线性表
  • 插入元素
  • 删除线性表中的元素
  • 查询
  • 输出线性表
  • 合并两个表
  • 逻辑运行(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;
}

后续

如果想了解更多物联网、智能家居项目知识,可以关注我的程序设计专栏。
或者关注公众号。

编写不易,感谢支持。

线性表的顺序表示和实现(严蔚敏版)相关推荐

  1. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  2. 数据结构-线性表的顺序结构

    1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typedef int ElemType; //线性表存储基本类型 ...

  3. 02_线性表的顺序表示和实现

    版权声明:本文为博主原创文章,未经博主允许不得转载 是时候重新系统的学习/复习一遍<数据结构>了!教材用的是清华出版社严蔚敏的<数据结构>,但众所周知,这本教材中给出的都是伪C ...

  4. 数据结构源码笔记(C语言):线性表的顺序表示

    /* SeqList.c*/ /*线性表的顺序表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...

  5. 四、【线性表】线性表的顺序表示和实现

    线性表的顺序表示和实现 前文我们提到过线性表是逻辑结构,只说明了数据元素之间的相互关系,想要使用线性表,我们还需要在计算机上表示出这些数据元素以及元素之间的关系.而对于同一种逻辑结构,可以有多种存储结 ...

  6. c语言建立线性表(顺序储存,链式储存,循环,双向)全

    c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...

  7. mysql 线性表_数据结构-线性表之顺序表

    线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...

  8. 数据结构——绪论以及线性表的顺序表示

    绪论 数据类型 数据类型是一个值的集合和定义在此集合上一组操作的总称. (1)原子类型:其值不可再分的数据类型,如int,char,float. (2)结构类型:其值可以再分解为若干成分的数据类型. ...

  9. 数据结构(2) -- 线性表的顺序表示

    2.2 线性表的顺序表示 顺序表基本操作: 插入操作:最坏情况O(n),最好情况O(1),平均情况O(n) 删除操作:最坏情况O(n),最好情况O(1),平均情况O(n) 按值查找:最坏情况O(n), ...

最新文章

  1. 4、题目要求:读入N名学生的成绩,将获得某一给定分数的学生人数输出。 * * 输入格式:测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的成绩,相邻两数字用一个
  2. Xcode 7错误:“缺少iOS分发签名身份...”
  3. 扩频技术matlab仿真,基于Simulink的扩频通信仿真
  4. PHP 实现移除数组中项目为空的元素或为某值的元素
  5. Java 7:使用NIO.2进行文件过滤-第1部分
  6. WPF DataGrid
  7. MyBaits resultMap 返回值与对象不匹配处理
  8. flex 错误信息类型及解决方法
  9. Java基础教程汇总
  10. 安卓udp发包工具_网络发包工具_xcap网络发包工具免费版V1.0.2下载(暂未上线)_预约_飞翔下载...
  11. Java实现DFA算法敏感词过滤
  12. MySQL统计每月数量并计算同比增长率
  13. LONG RAW转换BLOB
  14. 8x能不能升级鸿蒙,华为没有忘记老用户,畅享系列升级鸿蒙OS,荣耀8X在列
  15. TP50 TP90 TP95 TP99 TP999 TP9999
  16. 联通数科一面+二面+面谈 经验分享 base济南
  17. MySQL innodb引擎,事务提交 commit 异常,但数据提交成功
  18. 51单片机自学--改造我的机器
  19. DWL-2100AP 默认登录帐号密码
  20. 解决labelimg闪退

热门文章

  1. java后台传一个对象到前台_前台判断对象中的一个布尔值_前后台分离的项目中,如何优雅的传输boolean类型的参数...
  2. mysql 不能定义用户变量名_mysql 变量名称的使用不当的一个错误
  3. codeforces 536a//Tavas and Karafs// Codeforces Round #299(Div. 1)
  4. python朋友圈切图代码
  5. apache开启虚拟主机localhost无法访问
  6. connect: Address is invalid on local machine or port is not valid on remote
  7. vue中的v-text指令之Vue知识点归纳(二)
  8. 音频编码:ADPCM
  9. rocketMQ基本架构简介
  10. 第2小节,深入剖析gym环境构建