数据结构c语言版 线性表的动态分配顺序存储结构表示和实现,《数据结构》(C语言版)——线性表的动态分配顺序存储结构...
发布日期:2022-02-08 20:24:06 浏览次数:25 分类:技术文章

本文共 4280 字,大约阅读时间需要 14 分钟。

//malloc()

#include //srand((unsigned)time(NULL));

//用宏定义确定ElemType类型

#define ElemType int

//-----线性表的动态分配顺序存储结构-----

#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量

#define LISTINCREMENT5 //线性表存储空间的分配增量

typedef struct {

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

int length;//当前长度

int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)

} SqList;

// 操作结果:构造一个空的线性表L。

Status InitList_Sq(SqList &L) {//构造一个空的顺序表,动态申请存储空间

L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if (!L.elem) {//存储分配失败

printf("初始化失败");

exit(OVERFLOW);//exit(-1)程序异常退出

}

L.length = 0;//空表的长度初始化为0

L.listsize = LIST_INIT_SIZE;//空表的初始存储空间为 LIST_INIT_SIZE

return OK;

}// InitList_Sq算法2.3

// 初始条件:线性表L已存在。

// 操作结果:销毁线性表L。

Status DestroyList_Sq(SqList &L) {

//free(L.elem);//释放存储空间基址

L.elem = NULL;//存储空间基址置空

L.length = 0;//当前长度初始化为 0

L.listsize = 0;//分配的存储容量为 0

return OK;

}// DestroyList_Sq

// 初始条件:线性表L已存在。

// 操作结果:将L重置为空表。

Status ClearList_Sq(SqList &L) {

L.length = 0;

return OK;

}// ClearList_Sq

// 初始条件:线性表L已存在。

// 操作结果:若L为空表,返回TRUE,否则返回FALSE。

Status ListEmpty_Sq(SqList L) {

return L.length ? TRUE : FALSE;

}// ListEmpty_Sq

// 初始条件:线性表L已存在。

// 操作结果:返回L中数据元素个数。

int ListLength_Sq(SqList L) {

return L.length;

}// ListLength_Sq

// 初始条件:线性表L已存在,1≤pos≤ListLength(L) 。

// 操作结果:用e返回L中第pos个数据元素的值。

Status GetElem_Sq(SqList L, int pos, ElemType &e) {

if(L.length==0 || pos<1 || pos>L.length)

return ERROR;

e = L.elem[pos-1];

return OK;

}// GetElem_Sq

// 初始条件:线性表L已存在,compare()是数据元素判定函数。

// 操作结果:返回L中第1个与e满足compare()的数据元素的位序,若这样的数据元素不存在,则返回值为0。

Status compare(ElemType listElem, ElemType e) {

if(listElem==e)//找到元素e

return TRUE;

else {

//printf("在列表中没有值为%d的元素\n", e);

return FALSE;

}

}// Compare

int LocateElem_Sq(SqList L, ElemType e, Status (*pfn_compare)(ElemType, ElemType)) {

int i = 1;//i的初值为第1元素的位序

ElemType *p = L.elem;//p的初值为第1元素的存储位置

//*p++代表*(p+1), 在循环中意味调用函数Status (*compare)(ElemType, ElemType),

//用线性表中的每个元素与e比较,当*p++与e相等时,返回1,取反为0,循环中止。

//compare是指向函数的指针

while(i<=L.length && !(*pfn_compare)(*p++, e))

++i;//compare是一个指向函数的指针,返回值为Status(int)

if (i<=L.length) {

return i;//i的值在线性表中,返回元素的位序

} else

return 0;

}// LocateElem_Sq 算法2.6

// 初始条件:线性表L已存在。

// 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。

Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType &pre_e) {

int i = LocateElem_Sq(L, cur_e, compare);

if(i==0 || i==1) return ERROR;

GetElem_Sq(L, i-1, pre_e);

return OK;

}

// 初始条件:线性表L已存在。

// 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,pre_e无定义。

Status NextElem_Sq(SqList L, ElemType cur_e, ElemType &next_e) {

int i = LocateElem_Sq(L, cur_e, compare);

if(i==0 || i==L.length) return ERROR;

GetElem_Sq(L, i+1, next_e);

return OK;

}

// 初始条件:线性表L已存在,1≤pos≤ListLength(L)+1。

// 操作结果:在L中第pos个位置之前插入新的元素e,L的长度加1。

Status ListInsert_Sq(SqList &L, int pos, ElemType e) {

if (pos<1 || pos>L.length+1) { //pos的合法值为1≤pos≤ListLength(L)+1。即插入元素的位置pos应大于 0,小于 线性表的长度+1

printf("插入位置有问题");

return ERROR;

}

if (L.length >= L.listsize) {//当前存储空间已满,增加分配

ElemType *newbase = (ElemType*)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType));

if (!newbase) {//realloc更改已分配的内存单元大小

printf("存储分配失败");

exit(OVERFLOW);//存储分配失败

}

L.elem = newbase;//新基址

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

}

ElemType *q = &(L.elem[pos-1]);//q为插入位置,即将插入位置的地址赋给q

ElemType *p = &(L.elem[L.length-1]);//p为最后一个元素的地址

for ( ; p>=q; --p) {

*(p+1) = *p;//插入位置及之后的元素右移

}

*q = e;//插入e

++L.length;//表长增1

return OK;

}//ListInsert_Sq 算法2.4

// 初始条件:线性表L已存在且非空,1≤pos≤ListLength(L)。

// 操作结果:删除L的第pos个数据元素,并用e返回其值,L的长度减1。

Status ListDelete_Sq(SqList &L, int pos, ElemType &e) {

if (pos>L.length || pos<1) {//pos的合法值为1<=pos<=ListLength_Sq(L),即删除元素的位置pos应大于 0,小于 线性表的长度+1

printf("被删除元素的位置有误");

return ERROR;

}

ElemType *p = &(L.elem[pos-1]);//p为被删除元素的位置 ,即将被删除元素的地址赋给p

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

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

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

*(p-1) = *p; //假定在线性表{11 12 13 14 15}中删除13,变为{11 12 14 15},

}//则有 pos=3,e=13,p=&e,则循环初始条件++p=&(L.elem[3])即*p=14,*(p-1)=*p即将14往前移一位

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

return OK;

}// ListDelete_Sq 算法2.5

// 初始条件:线性表L已存在。

// 操作结果:依次对L的每个数据元素调用函数visit()。一旦vistit()失败,刚操作失败。

Status visit(ElemType e) {

printf("%d ", e);

return OK;

}

Status ListTraverse_Sq(SqList L, Status (*pfn_visit)(ElemType)) {

if(!L.elem){

printf("\n线性表未初始化或被销毁了!!!");

return ERROR;

}

if(L.length == 0)

printf("线性表中无元素!!!");

for (int i=0; i

转载地址:https://blog.csdn.net/weixin_33132553/article/details/117177839 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c语言求解极大质数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
下一篇:c语言其他运算符serft,东软面历年考题汇总(完全).doc

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2023年05月31日 20时05分40秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

ajax html send,Use AJAX to send html5 textarea directly without html | 易学教程 2019-08-24 11:20:49
html 每个选项后面加个删除,jQuery.html()将删除选择选项的所选属性 2019-08-24 11:20:49
南开中学 高考成绩查询 2021,天津市南开中学 2019-08-24 11:20:48
审论文HTML和pdf,浅谈HTML5的发展与现状(最标准格式论文).pdf 2019-08-24 11:20:48
html盒子模型 正方形嵌套,div盒子模型实例 2019-08-24 11:20:47
webpack对html压缩,求助,webpack 如何打包html,在html中可以压缩哪些东西?如何配置?... 2019-08-24 11:20:47
android漏洞公告,7月份Android安全公告公布 已修复多个严重漏洞 2019-08-24 11:20:46
正则匹配后缀 html,nginx 进行正则匹配(常见正则匹配符号表示) 2019-08-24 11:20:46
android info,总结Android中的Info系列类 2019-08-24 11:20:45
腾讯机顶盒 android,2021年网络机顶盒排行榜最强!泰捷、小米、腾讯极光深度评测... 2019-08-24 11:20:45
android10如何省电,安卓手机如何省电 这些方法都很有效 2019-08-24 11:20:44
android iterator,Iterator取内容 2019-08-24 11:20:43
android中拍照功能介绍,Android实现拍照功能 2019-08-24 11:20:43
荣耀9何时升级鸿蒙,华为并没有放弃荣耀!多款老机型可升级鸿蒙,荣耀9X最先被确认... 2019-08-24 11:20:42
Android组件化多个manifest,组件化引用极光推送,每个组件的build.gradle都需要写manifestPlaceholders... 2019-08-24 11:20:42
android 自定义控件队列弹出,Android自定义控件(一)——开关控件 2019-08-24 11:20:41
c语言捕捉信号的头文件,C语言之捕捉信号 2019-08-24 11:20:41
c语言 循环报错,while循环中的malloc与free报错 2019-08-24 11:20:40
这是一个人机反猜数字游戏,人想一个数,电脑来猜, c语言,“人机猜数游戏”C高手来~~~~~~~~~~~~~~~~~~~~? 爱问知识人... 2019-08-24 11:20:40
C语言设计A与B的区别,C语言辅导 - a>b>c与a=b=c的区别 and something else 2019-08-24 11:20:40