数据结构 顺序表 c++

线性表的顺序表示和实现

静态分配

#define Maxsize 100

typedef struct List{

Elemtype data[Maxsize];

int len;

};

void InitList(List& L) {

L.len = 0;

}//构造空表

void DestroyList(List& L) {

delete L.data;

L.len = NULL;

}//销毁

bool ListEmpty(List L) {

if (L.len == 0)return true;

else return false;

}//判空

int ListLength(List L) {

return L.len;

}//表长

void GetElem(List L, int i, Elemtype& e) {

e = L.data[i-1];

}//用e返回L中第i个数据元素

int LocateElem(List L,Elemtype e, bool (*compare)(Elemtype , Elemtype )) {

int i = 0;

for (i; i < L.len; i++) {

if (compare(e, L.data[i]))break;

}

return (i + 1);

}//返回满足copmare函数的e在L中的位序

void PriorElem(List L, Elemtype cur_e, Elemtype & pre_e) {

for (int i = 0; i < L.len; i++)

if (L.data[i] == cur_e && i != 0) { pre_e = L.data[i-1]; break; }

}//用pre_e返回cur_e的前驱

void NextElem(List L, Elemtype cur_e, Elemtype& next_e) {

for (int i = 0; i < L.len; i++)

if (L.data[i] == cur_e && i != L.len-1) { next_e = L.data[i + 1]; break; }

}//用next_e返回cur_e的后继

void ListInsert(List& L, int i, Elemtype e) {

for (int j = L.len; j > i-1; j--)L.data[j] = L.data[j - 1];

L.data[i-1] = e;

L.len++;

}//在L的第i位的元素前插入元素e

void ListDelete(List& L, int i, Elemtype& e) {

e = L.data[i - 1];

L.len--;

for (int j = i - 1; j < L.len; j++)L.data[j] = L.data[j + 1];

}//用额返回L中第i位元素并删除该元素

void ListTraverse(List L, void (*visit)(Elemtype)) {

for (int i = 0; i < L.len;i++) {

visit(L.data[i]);

}

}//用visit函数遍历L

动态分配

用到了malloc和free函数实现动态分配

相较于静态分配修改的部分是:

#define Initsize 10 //默认最大长度

typedef struct SeqList {

Elemtype* data;

int Maxsize;

int len;

};

void InitList(SeqList& L) {

L.data = (Elemtype*)malloc(Initsize * sizeof(Elemtype));

L.len = 0;

L.Maxsize = Initsize;

}//创建空表

void Increasesize(SeqList& L, int len) {

Elemtype* p = L.data;

L.data = (Elemtype*)malloc((L.Maxsize + len) * sizeof(Elemtype));

for (int i = 0; i < L.len; i++)L.data[i] = p[i];//转移数据

L.Maxsize = L.Maxsize + len;

free(p);

}//增加表长

void DestroyList(SeqList& L) {

free(L.data);

L.Maxsize = NULL;

L.len = NULL;

}//销毁

代码:

#define Initsize 10 //默认最大长度
typedef struct SeqList {
	Elemtype* data;
	int Maxsize;
	int len;
};
void InitList(SeqList& L) {
	L.data = (Elemtype*)malloc(Initsize * sizeof(Elemtype));
	L.len = 0;
	L.Maxsize = Initsize;
}//创建空表
void Increasesize(SeqList& L, int len) {
	Elemtype* p = L.data;
	L.data = (Elemtype*)malloc((L.Maxsize + len) * sizeof(Elemtype));
	for (int i = 0; i < L.len; i++)L.data[i] = p[i];//转移数据
	L.Maxsize = L.Maxsize + len;
	free(p);
}//增加表长
void DestroyList(SeqList& L) {
	free(L.data);
	L.Maxsize = NULL;
	L.len = NULL;
}//销毁
bool ListEmpty(List L) {
	if (L.len == 0)return true;
	else return false;
}//判空
int ListLength(List L) {
	return L.len;
}//表长
void GetElem(List L, int i, Elemtype& e) {
	e = L.data[i-1];
}//用e返回L中第i个数据元素
int LocateElem(List L,Elemtype e, bool (*compare)(Elemtype , Elemtype )) {
	int i = 0;
	for (i; i < L.len; i++) {
		if (compare(e, L.data[i]))break;
	}
	return (i + 1);
}//返回满足copmare函数的e在L中的位序
void PriorElem(List L, Elemtype cur_e, Elemtype & pre_e) {
	for (int i = 0; i < L.len; i++)
		if (L.data[i] == cur_e && i != 0) { pre_e = L.data[i-1]; break; }
}//用pre_e返回cur_e的前驱
void NextElem(List L, Elemtype cur_e, Elemtype& next_e) {
	for (int i = 0; i < L.len; i++)
		if (L.data[i] == cur_e && i != L.len-1) { next_e = L.data[i + 1]; break; }
}//用next_e返回cur_e的后继
void ListInsert(List& L, int i, Elemtype e) {
	for (int j = L.len; j > i-1; j--)L.data[j] = L.data[j - 1];
	L.data[i-1] = e;
	L.len++;
}//在L的第i位的元素前插入元素e
void ListDelete(List& L, int i, Elemtype& e) {
	e = L.data[i - 1];
	L.len--;
	for (int j = i - 1; j < L.len; j++)L.data[j] = L.data[j + 1];
}//用额返回L中第i位元素并删除该元素
void ListTraverse(List L, void (*visit)(Elemtype)) {
	for (int i = 0; i < L.len;i++) {
		visit(L.data[i]);
	}
}//用visit函数遍历L

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值