C语言线性表之顺序表的13种函数操作

学习数据结构开始就会学到第一种数据存储结构–线性表,学习线性表时一定会先学到顺序表,顺序表是一个较为简单的线性表,没有链表满天飞的指针。它的本质就是申请一块连续的内存,和数组相似,保存第一个地址的指针就欧克了,在通过第一个地址往后偏移若干量来实现能对所有进行操作。直接看一下创建一个线性表及多种操作的代码吧。

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE -1
#define TURE 1
#define ERROR -1
#define OVERFLOW -1
#define INFEASIBLE -1
#define LIST_INIT_SIZE 100  //初始顺序表长度
#define LISTINCREMENT 10  //插入元素内存不够时每次申请这么大的补加容量
typedef int Status;
typedef int ElemType;

typedef struct
{
	ElemType *elem;//顺序表首位置指针
	int length;//记录顺序表存了多少长度
	int listsize;//记录顺序表大小
}Sqlist;//定义结构体,创建顺序表方便

Status InitList(Sqlist &L)//建立并初始化顺序表
{
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if (!L.elem) exit(OVERFLOW);//如果没有那么大空间了报错
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}

void  Destorylist(Sqlist &L)//销毁顺序表
{
	if (L.elem)
	{
		free(L.elem);
		L.elem = NULL;
		printf("L has been destoried.\n");
	}
}
void ClearList(Sqlist &L)//清空顺序表
{
	L.length = 0;//实际上原来表里的元素没有删除,只是通过length归零不能查看而已
	printf("L has been cleared.\n");
}
Status EmptyList(Sqlist L)//判断是否为空
{
	if (L.length == 0)
		return TURE;
	else
		return FALSE;
}
Status LengthList(Sqlist L)//求长度
{
	return L.length;
}
Status GetElem(Sqlist L, int i, ElemType &e)//求第几个位置上的元素
{
	if (L.length == 0 || i<1 || i>L.length)
		return ERROR;
	e = L.elem[i - 1];
	return e;
}
Status LocateELem(Sqlist L, ElemType e)//求某元素在第几个位置上
{
	int i = 1;
	bool cmp = 0;
	if (L.length == 0)
		return 0;
	else {
		while (i <= L.length && !cmp)
		{
			if (L.elem[i - 1] == e)
				cmp = 1;
			i++;
		}
	}
	if (cmp)return i - 1;
	else return 0;
}
Status PriorElem(Sqlist L, ElemType cur_e, ElemType &pre_e)//求某元素的前驱元素
{
	int i = LocateELem(L, cur_e);
	if (i == 0)printf("不存在!\n");
	else if (i == 1)
		printf("这是第一个元素,无前驱!\n");
	else pre_e = L.elem[i - 2];
	return pre_e;
}
Status NextElem(Sqlist L, ElemType cur_e, ElemType next_e)//求某元素后继元素
{
	int i;
	ElemType *p, *q;
	p = &L.elem[0];
	for (i = 0; i < L.length - 2; i++)
	{
		if (cur_e == L.elem[i])
		{
			p = &L.elem[i];
			break;
		}
	}
	q = p + 1;
	next_e = *q;
	return next_e;
}
Status InsertElem(Sqlist L, int i, ElemType e)//插入元素
{
	ElemType *p, *q;
	if (i<1 || i>L.length + 1)
	{
		printf("位置不正常\n");
		return ERROR;
	}
	if (L.length == L.listsize)
	{
		L.elem = ((ElemType*)realloc(L.elem, (LIST_INIT_SIZE + LISTINCREMENT) * sizeof(ElemType)));
		L.listsize = LIST_INIT_SIZE + LISTINCREMENT;
	}
	q = &L.elem[i - 1];
	for (p = &L.elem[L.length - 1]; p >= q; p--)
		*(p + 1) = *p;
	*q = e;
	L.length++;
	return e;
}
Status DeleteElem(Sqlist &L, int i, ElemType e)//删除元素
{
	ElemType *p, *q;
	if (!L.elem)
		return ERROR;
	if (i<1 || i>L.length)
		return ERROR;
	q = &L.elem[i - 1];
	e = *q;
	for (p = &L.elem[i - 1]; p < &L.elem[L.length - 1]; ++p)
	{
		*p = *(p + 1);
	}
	L.length--;
	return e;
}

void TraverList(Sqlist L)//遍历表
{
	int i;
	for (i = 0; i < L.length; i++)
		printf("%5d", L.elem[i]);
}

Status CompareList(Sqlist L, ElemType e1, ElemType e2)//比较大小
{
	if (e1 > e2 || e2 == e2)
		return TURE;
	else
		return FALSE;
}
int main()
{
	Sqlist L;
	InitList(L);
	int a, b, c, d = 0, f, g, i;
	ElemType e = 0;
	//初始化测试
	printf("初始顺序表的长度%d\n\n", LengthList(L));
	printf("请输入要添加的元素个数:");
	scanf_s("%d", &L.length);
	//求表长测试
	printf("\n当前顺序表的长度%d\n", LengthList(L));
	printf("\n请输入线性表元素:");
	for (i = 0; i < L.length; i++)
		scanf_s("%d", &L.elem[i]);
	//遍历测试
	printf("\n您输入的元素为:");
	TraverList(L);
	printf("\n");
	//定位操作
	printf("请输入你要定位的元素:");
	scanf_s("%d", &g);
	printf("%d的位置为:%d\n", g, LocateELem(L, g));
	//求前驱测试
	printf("请输入你想求前驱的元素:");
	scanf_s("%d", &a); printf("\n");
	printf("%d的前驱为:%d", a, PriorElem(L, a, d));
	//求后继测试
	printf("\n请输入你想求后继的元素: ");
	scanf_s("%d", &f); printf("\n");
	printf("%d的后继为:%d", f, NextElem(L, f, d));
	//取元素测试
	printf("\n接下来测试取元素\n\n请输入你想取出的元素位序:");
	scanf_s("%d", &i);
	printf("\n\n");
	printf("你取出的元素为:%d", GetElem(L, i, e));
	printf("\n\n");
	//删除测试
	printf("现在测试删除\n\n请输入删除位置: ");
	scanf_s("%d", &b);
	printf("\n");
	printf("你删除的元素为: %d", DeleteElem(L, b, e));
	printf("\n\n");
	printf("现在线性表中的元素为:");
	for (i = 0; i < L.length; i++)
		printf("%5d", L.elem[i]);
	//插入测试
	printf("\n现在测试插入\n");
	printf("请输入你要插入的位置:");
	scanf_s("%d", &c);
	printf("\n");
	printf("请输入你要插入的元素:");
	scanf_s("%d", &e);
	printf("\n");
	printf("你插入的元素为:%d", InsertElem(L, c, e));
	printf("\n");
	printf("现在顺序表为: ");
	for (i = 0; i < L.length + 1; i++)
		printf("%5d", L.elem[i]);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值