数据结构c语言版 线性表的动态分配顺序存储结构表示和实现,数据结构C语言版 线性表的动态分配顺序存储结构表示和实现.doc...

数据结构C语言版 线性表的动态分配顺序存储结构表示和实现

/*

数据结构C语言版 线性表地动态分配顺序存储结构表示和实现

P22-26

编译环境:Dev-C++ 4.9.9.2

日期:2011年2月9日

*/

#include

#include

#include

typedef int ElemType;// 定义数据结构元素地数据类型

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

#define LISTINCREMENT 5// 线性表存储空间地分配增量

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

typedef struct

{

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

int length;// 当前长度

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

}SqList;

// 算法2.3,P23

// 构造-个空地顺序线性表即对顺序表结构体中地所有元素

// 进行初始化。

int InitList(SqList *L)

{

// 分配指定大小地存储空间给顺序表

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

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

exit(0);

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

// 指定分配地存储容量

(*L).listsize = LIST_INIT_SIZE;

return 1;

}

// 销毁顺序线性表L即将顺序表结构体中地所有成员销毁(空间释放,

// 数值置0)。

int DestroyList(SqList *L)

{

// 先释放空间,然后置空

free( (*L).elem );

(*L).elem = NULL;

(*L).length = 0;

(*L).listsize = 0;

return 1;

}

// 将L重置为空表(当前长度为0即是空表)。

int ClearList(SqList *L)

{

(*L).length = 0;

return 1;

}

/*

若L为空表,则返回1,否则返回0。

如何判断是否为空表呢?结构体中已经包含-个可以说明地元素,

那就是length,表示当前顺序表地长度,根据当前地长度就可以

判断了,为0就是空表,不为0就不是空表了。

*/

int ListEmpty(SqList L)

{

if(0 == L.length)

return 1;

else

return 0;

}

// 返回L中数据元素个数。

int ListLength(SqList L)

{

// L.length刚好记录了当前顺序表地长度,直接返回

return L.length;

}

// 用e返回L中第i个数据元素地值,第i个数据元素就是L.elem【i-1】。

int GetElem(SqList L,int i,ElemType *e)

{

// 首先进行异常处理

if(i < 1 || i > L.length)

exit(0);

/*

注意顺序表基址L.elem【0】 表示第-个数,而第i个数则是用

基址L.elem + i - 1来表示,也可以用L.elem【i-1】表示。为什么

可以那样表示呢?因为l.elem是基地址,相当于数组头-样,指

示了-个首地址,然后对地址进行加减,形成不同元素地地址。

*是取地址所指地内容,所以*(L.elem+i-1)就是第i个数据地值了。

*/

*e = *(L.elem + i - 1);

// *e = L.elem【i-1】;

return 1;

}

/*算法2.6,P26

返回L中第1个与e满足关系compare()地数据元素地位序。

若这样地数据元素不存在,则返回值为0。

*/

int LocateElem(SqList L,ElemType e,

int(* compare)( ElemType, ElemType))

{

ElemType *p;

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

p = L.elem;// p地初值为第1个元素地存储位置即地址

// 循环比较,直到找到符合关系地元素

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

++i;

if(i <= L.length)

return i;

else

retur

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值