大家好,今天给大家总结了一下数据结构里面的线性表的顺序结构,顺序表表示的是用一组地址连续的存储单元依次存储线性表的数据元素,所以顺序结构的实现一般采用数组的方式来实现,存储空间也采用动态分配的方式。在定义中用一个ElemType * elem表示基地址,int length 表示当前长度,int listsize表示数组的大小。具体实现的代码如下:

/*

* 数据结构线性表顺序结构的实现

*/

#include

#include

/*

ADT List{

//基本操作:

InitList(&L); //操作结果:构造一个空的线性表;

DestroyList(&L); //初始条件:线性表L已存在操作结果:销毁线性表 L ;

ListEmpty(&L); //初始条件:线性表L已存在操作结果:若L为空表,则返回TRUE,否则,返回FALSE ;

ListLength(&L); //初始条件:线性表L已存在操作结果:若返回L中元素的个数 ;

GetElem(&L,i,e);//初始条件:线性表L已存在操作结果:用e返回L中第i个数据元素的值;

ListInsert(&L,i,e); //初始条件:线性表L已存在,1<=I<=LiseLenght(L)+1操作结果:第i个元素之前插入元素e ,L+1;

ListDelete(&L,i,&e); //初始条件:线性表L已存在,1<=I<=LiseLenght(L)操作结果:删除第i个元素,并用e返回其值,L-1 ;

ListTraverse(&l,width)//初始条件:线性表L已存在,操作结果:依次输出元素;

};

*/

#define TURE 1

#define FALSE 0

#define OK 1

#define SUCC 1

#define ERROR 0

#define LISTINCREMENT 1

#define LIST_INIT_SIZE 20

typedef int ElemType;

typedef int Status;

typedef struct{

ElemType *elem;//存储空间基地址

int length;//当前长度

int listsize;//当前分配的存储容量

}SqList;

Status InitList_Sq(SqList *L) {

// 构造一个空的线性表L,初始化存储容量和当前长度。

L->elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if (!L->elem) return OK; // 存储分配失败

L->length = 0; // 空表长度为0

L->listsize = LIST_INIT_SIZE; // 初始存储容量

return OK;

}

Status DestroyList_Sq(SqList *L) {

//当L存在时,销毁顺序表

if(L->elem!=NULL){

free(L->elem);//线性表不为空时,依次释放

L->elem=NULL;

L->length = 0;

L->listsize = 0;

}

if(L->elem==NULL)

return SUCC;

}

Status ListTraverse_Sq(SqList *L, int Width){

//遍历输出线性表

int i;

for(i=0;ilength;i++){

printf("%3d",L->elem[i]);

if((i+1)%Width==0)

printf("n");

}

printf("n");

}

Status FillNumbers_Sq(SqList *L,int length, ElemType Number){

//给线性表一个初始化的数据

int i;

if(length<=L->listsize){

for(i=0;i

L->length++;//长度+1

L->elem[i]=Number++;//元素存入

//scanf("%d",&L->elem++);//也可用用户输入

}

}

return SUCC;

}

StatusListInsert_Sq(SqList *L,int i,ElemType e){

// 在顺序线性表L的第i个元素之前插入新的元素e,

// i的合法值为1≤i≤ListLength_Sq(L)+1

ElemType *p;

if (i < 1 || i > L->length+1) return ERROR; // i值不合法

if (L->length >= L->listsize) { // 当前存储空间已满,增加容量

ElemType *newbase = (ElemType *)realloc(L->elem,

(L->listsize+LISTINCREMENT)*sizeof (ElemType));

if (!newbase) return ERROR; // 存储分配失败

L->elem = newbase; // 新基址

L->listsize += LISTINCREMENT; // 增加存储容量

}

ElemType *q = &(L->elem[i-1]); // q为插入位置

for ( p= &(L->elem[L->length-1]); p>=q; --p) *(p+1) = *p;

// 插入位置及之后的元素右移

*q = e; // 插入e

++L->length; // 表长增1

return OK;

}

StatusListDelete_Sq(SqList *L,int i,ElemType *e){

// 在顺序线性表L中删除第i个元素,并用e返回其值。

// i的合法值为1≤i≤ListLength_Sq(L)。

ElemType *p, *q;

if (i<1 || i>L->length) return ERROR; // i值不合法

p = &(L->elem[i-1]); // p为被删除元素的位置

*e = *p; // 被删除元素的值赋给e

q = L->elem+L->length-1; // 表尾元素的位置

for (++p; p<=q; ++p) *(p-1) = *p; // 被删除元素之后的元素左移

--L->length; // 表长减1

return OK;

}

Status GetElem_Sq(SqList *L,int i,ElemType *e){

//获取第i个元素的值,并存放到e

if (i < 1 || i > L->length+1) return ERROR; // i值不合法

*e=L->elem[i-1];

return SUCC;

}

void MergeList_Sq(SqList *La, SqList *Lb, SqList *Lc) {

// 已知顺序线性表La和Lb的元素按值非递减排列。

// 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。

ElemType *pla,*plb,*plc,*pla_last,*plb_last;

pla = La->elem; plb = Lb->elem;

Lc->listsize = Lc->length = La->length+Lb->length;

plc = Lc->elem = (ElemType *)malloc(Lc->listsize*sizeof(ElemType));

if (!Lc->elem)

return FALSE; // 存储分配失败

pla_last = La->elem+La->length-1;//la 最后一个元素的地址

plb_last = Lb->elem+Lb->length-1;

while (pla <= pla_last && plb <= plb_last) { // 归并插入

if (*pla <= *plb)

*plc++ = *pla++;

else

*plc++ = *plb++;

}

while (pla <= pla_last) *plc++ = *pla++; // 插入La的剩余元素

while (plb <= plb_last) *plc++ = *plb++; // 插入Lb的剩余元素

}

void main(){

int i=0,j=0, n,m,temp;

SqList myList,la,lb,lc;

InitList_Sq(&myList);

FillNumbers_Sq(&myList,20,1);

myList.elem[3]= 31;//随机存取

ListTraverse_Sq(&myList, 5);

printf("%dn",myList.elem[3]);//随机存取

ListInsert_Sq(&myList,10,54);

printf("第10个位置插入54:n");

ListTraverse_Sq(&myList, 5);

ListDelete_Sq(&myList,12,&m);

printf("第12个位置删除%d:n",m);

ListTraverse_Sq(&myList, 5);

GetElem_Sq(&myList,15,&n);

printf("第15个元素为%d.n",n);

InitList_Sq(&la);

InitList_Sq(&lb);

FillNumbers_Sq(&la,15,15);

FillNumbers_Sq(&lb,10,8);

MergeList_Sq(&la,&lb,&lc);

printf("LC:n");

ListTraverse_Sq(&lc,5);

printf("La:n");

ListTraverse_Sq(&la,5);

printf("Lb:n");

ListTraverse_Sq(&lb,5);

DestroyList_Sq(&myList) ;

DestroyList_Sq(&la) ;

DestroyList_Sq(&lb) ;

DestroyList_Sq(&lc) ;

printf("销毁后La:n");

ListTraverse_Sq(&la,5);

}

以下是程序运行的结果

以上便是我总结的数据结构线性表的相关知识和代码,有不足之处请多多指出,代码多为课本教材的参考总结和自己的灵活想象。

参考教材:《数据结构(C语言版)》严蔚敏 吴伟民 · 清华大学出版社

c语言构造一个空线性表l,数据结构线性表顺序结构的定义与实现C语言-Go语言中文社区...相关推荐

  1. C语言将结点s赋给表L,数据结构-单链表

    一.单链表基本定义 线性表的链式存储:线性表采用链式方式将结点链接起来的存储结构称之链表.单链表结构,分前后两个域,date数据域:存放结点的值,next指针域:存放数据元素后继的位置.附设头结点的目 ...

  2. 数据结构 线性表java_java数据结构--线性表

    一.线性表基本概念 线性表是其组成元素间具有线性关系的一种线性结构,是由n个数据类型相同的元素构成的有限序列.其具有"一对一"的逻辑关系,与位置有关,除了头尾元素之外,每一个元素都 ...

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

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

  4. 从零开始学C语言数据结构 : 二叉树的顺序结构

    二叉树的顺序结构 1.树 1.1树的概念 1.2树的表示 1.3二叉树 2.二叉树的顺序结构 1.堆 2.堆的实现 2.1.向下调整 2.2堆的创建--向下调整实现 2.3建堆的时间复杂度 2.4堆的 ...

  5. java 跳表_数据结构跳表学习并用Java实现

    前面学习很多类的源码过程中,底层基本都是数组和链表,今天学习第三种结构跳表(SkipList). 跳表解决的问题 一个有序的数组如果我们要判断一个数据是否存在可以通过二分查找法非常快速的判断出来,但是 ...

  6. c++结构体定义和使用_【C语言更新】结构体的定义及使用

    文/Edward首先先思考一个问题,假设某一天你去了一家策划公司,接到了一个策划需求,比如为新上市的某款手机写一个市场推广的文案,并且在电脑上面打印出来.那么在写这个文案的时候,你肯定是会需要着重地去 ...

  7. 【C语言】一个学生信息排序程序(学生信息表)【注释详细】【链表】

    题目 一.编写一个学生信息排序程序.要求: 1.可随时输入n个学生的信息和成绩(n不设置上限). 2.学生信息包括:学号.姓名.性别.专业.学院:三门课程成绩. 3.为用户提供一个排序选择列表,使得用 ...

  8. c语言 判断一个图是否全连通_【连载】(判断执行语句)乐创DIY C语言讲义——3.8节(2)...

    2 判断执行语句 判断执行语句,执行时候会有一个条件判断,一旦当条件判断为真,即True的时候,就执行相应的语句,满足条件被执行的语句用大括号"{}"括起来.由于在C语言中没有用于 ...

  9. 用c语言实现一个简单的计算器(数据结构)

    概要:主要以c语言为例对数据结构中写一个简易的计算器(计算整数间加减乘除括号运算)的算法进行大致讲述,细说如何去实现符号优先级的比较的函数实现. 注:由于编辑器缘故,本文内我以小写x代替了*作为乘号 ...

最新文章

  1. Debian上网的问题小结
  2. 在emu8086中学习几个汇编语言显示字符串的小例子
  3. 杭州水利水电学院计算机多少学,杭州的一所很容易考上的公办本科大学——浙江水利水电学院...
  4. JAVA学习--面向对象的特征二:继承性
  5. oracle查看context,oracle context(上下文)
  6. 平流式沉淀池表面负荷怎么计算_推荐收藏关于斜管(板)沉淀池的知识点汇总,及常见问题解决!...
  7. 提高数据质量的方法有哪些
  8. 建立一个vs+qt打开系统摄像头的程序
  9. Linux下设置定期执行脚本
  10. windows 超简单实现多用户远程桌面,RDP WRAPPER
  11. word 目录格式的设置
  12. Openstack1 云计算与虚拟化概念
  13. 2.4g低功耗SI24R1校园答题器
  14. 【历史上的今天】4 月 3 日:亚马逊卖出第一本书;世界上第一通手机电话;IBM 计算机先驱出生
  15. 解决ubuntu20.04播放b站视频,提示“May need to install the required video codecs”问题
  16. netstat命令 + 黑洞路由
  17. 网络安全原理与实践学习笔记——设计DMZ
  18. java安装好了打不开机_Java安装以后为什么打不开?java打不开一闪而过如何解决?...
  19. 啥是单点登陆?淘宝和天猫是如何实现同时登陆的?
  20. ArcGIS中ArcMap分割栅格Split Raster工具没有结果的解决

热门文章

  1. 面试:如何面对HR的提问?
  2. 如何在 Excel 中快速将多列数据合并到一列?(不同方法实现)前提不覆盖
  3. iTOP3A5000开发板多路PCIE、SATA、USB3.0等
  4. java的synthetic_java synthetic关键字
  5. 详解JavaScript运算符(一):赋值、算术、复合运算符
  6. [android] 手机卫士设备管理权限锁屏
  7. MATLAB绘制Z平面
  8. 用树型模型管理App数字和红点提示
  9. 5步完整的实操步骤,手把手教你,新手如何入门做短视频自媒体
  10. Jenkins如何设置邮箱自动发送邮件?