线性表的链式存储及其基本功能

原作者:点我查看原作者




#include<cstdio>
#include<iostream>
#include<cstdlib>
#define Elemtype int
#define Status int
#define OK 1
#define ERROR -1
typedef struct Node
{
	struct Node * next;
	Elemtype data;
} Node;
typedef  Node * PtrtoNode;
typedef PtrtoNode Header;
int main()
{
	Header La=NULL;
	Header InitList(void);
	Status DestroyList(Header L);
	Status ClearList(Header L);
	int ListEmpty(Header L);
	int ListLength(Header L);
	Status GetElem(Header L, int i, Elemtype &e);
	int LocateElem(Header L, Elemtype e);
	Status PriorElem(Header L, Elemtype cur_e, Elemtype &pre_e);
	Status NextElem(Header L, Elemtype cur_e, Elemtype &next_e);
	Status ListInsert(Header L, int i, Elemtype e);
	Status ListDelete(Header L, int i);
	Status ListTraverse(Header L);
	return 0;
}
//初始化线性表
Header InitList(void) {
	PtrtoNode L;
	L = (PtrtoNode)malloc(sizeof(Node));
	if (!L) exit(EXIT_FAILURE);
	L->next = NULL;
	return L;
}
//销毁线性表
Status DestroyList(Header L) {
	if (!L)return ERROR;
	PtrtoNode p = L;
	PtrtoNode t;
	while (p) {
		t = p;
		p = p->next;
		free(t);
	}
	return OK;
}
//将线性表重置为空表
Status ClearList(Header L) {
	if (!L)return ERROR;
	PtrtoNode p = L->next;
	PtrtoNode t;
	while (p) {
		t = p;
		p = p->next;
		free(t);
	}
	L->next = NULL;
		return OK;
}
//检验是否为空表 是则返回true 否则返回false
int ListEmpty(Header L) {
	if (!L) exit(-1);
	return L->next == NULL;
}
//返回L中元素的个数
int ListLength(Header L) {
	int i=1;
	if (!L)exit(-1);
	PtrtoNode p = L->next;
	while (p) {
		p = p->next;
		++i;
	}
	return i-1;
}
//用e返回L中第i个元素的值
Status GetElem(Header L, int i, Elemtype &e) {
	int j = 1;
	PtrtoNode p = L->next;
	while (p&&j < i) {
		p = p->next;
		++j;
	}
	if (!p || j > i) return ERROR;
	e = p->data;
	return OK;
}
//返回第一个与e相同的数据元素的位序
int LocateElem(Header L, Elemtype e) {
	if (!L) exit(-1);
	PtrtoNode p = L->next;
	int i=1;
	while (p&&e != p->data) {
		p = p->next;
		++i;
	}
	if (!p) return -1;
	return i;
}
//找出cur_e并用pre_e存储它的前驱值
Status PriorElem(Header L, Elemtype cur_e, Elemtype &pre_e) {
	if (!L) exit(-1);
	PtrtoNode p = L;
	if (p->next->data == cur_e) return ERROR;
	else p = p->next;
	while (p->next&&p->next->data != cur_e) {
		p = p->next;
	}
	if (!p->next)return ERROR;
	pre_e = p->data;
}
//找出cur_e并用next_e存储它的后继值
Status NextElem(Header L, Elemtype cur_e, Elemtype &next_e) {
	if (!L) exit(-1);
	PtrtoNode p = L->next;
	while (p&&p->data != cur_e) {
		p = p->next;
	}
	if (!p->next) exit(ERROR);
	next_e = p->next->data;
	return OK;
}
//在L的第i个位置前插入新的数据元素e
Status ListInsert(Header L, int i, Elemtype e) {
	if (!L||i<1) exit(-1);
	int j = 0;
	PtrtoNode p = L;
	PtrtoNode t = (PtrtoNode)malloc(sizeof(Node));
	while (p&&j < i - 1) {
		p = p->next;
		++j;
	}
	if (!p || j > i - 1) return ERROR;
	t->data = e;
	t->next = p->next;
	p->next = t;
	return OK;
}
//删除第i个元素
Status ListDelete(Header L, int i) {
	if (!L || i < 1) exit(-1);
	int j = 1;
	PtrtoNode p = L->next;
	PtrtoNode t = NULL;
	while (p&&j < i-1) {
		p = p->next;
		++j;
	}
	if (!(p->next) || j > i)return ERROR;
	t = p->next;
	p->next = p->next->next;
	free(t);
	return OK;
}
//遍历线性表
Status ListTraverse(Header L) {
	if (!L)exit(-1);
	PtrtoNode p = L->next;
	while (p) {
		printf("%d\n", p->data);
		p = p->next;
	}
	return OK;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值