严蔚敏老师C语言版数据结构之顺序表的12个基本操作

PS:如果手机显示不完可以用电脑查看

#include<stdio.h>
#include<stdlib.h>

#define ok 1
#define error 0
#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_sq(sqlist &l)//初始化线性表
{
	l.elem = (elemtype*)malloc(list_init_size*sizeof(elemtype));
	if (!l.elem)
		return error;//初始化失败
	l.length = 0;//置空表
	l.listsize = list_init_size;//线性表的最大存储容量
	return ok;//初始化成功,返回1
}

status crealist_sq(sqlist &l, int n)
{
	if (n<0 || n>l.listsize)
		return error;//输入的长度过大或者过小
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf_s("%d", &l.elem[i]);
		l.length++;
	}
	return ok;
}

status listinsert_sq(sqlist &l, int i, elemtype e)//插入元素
{
	int j;
	if (i<1 || i>l.length + 1)
		return error;    // i 值不合法
	if (l.length == l.listsize)
	{
		l.elem = (elemtype*)malloc(listincrement*sizeof(elemtype));//增加内存空间
		if (!l.elem) return error; //空间分配失败
		l.listsize = l.listsize + listincrement;
	};
	for (j = l.length - 1; j >= i - 1; j--)
		l.elem[j + 1] = l.elem[j]; // 第l.length~i的元素依次后移
	l.elem[i - 1] = e;//在i-1的位置插入元素e
	++l.length;	 // 表长增1
	return ok;
}//listinsert_sq

status print_sq(sqlist l)//遍历输出线性表l中的所有元素
{
	if (!l.elem)
		return error;
	int i = 0, j;
	for (i = 0, j = 1; i <l.length; i++, j++)
		printf("第%d个元素=%d\n", j, l.elem[i]);//数组的输出
	return ok;//遍历成功
}

status listdelete_sq(sqlist &l, int i, elemtype &e)//删除线性表l中的第i个元素
{
	int k;
	if (i<1 || i>l.length)
		return error;//删除的位置不合法
	e = l.elem[i - 1];
	for (k = i - 1; k< l.length - 1; k++)
		l.elem[k] = l.elem[k + 1];//从i到l.length-1的全部元素都要往前移一位
	l.length--;//长度减1
	return ok;//删除成功
}

int locateelem_sq(sqlist l, elemtype e)//在线性表中查找第一个与e相等的元素的位置
{
	int i;
	for (i = 0; i < l.length; i++)
	{
		if (l.elem[i] == e)
			return (i + 1);//查找到了则返回位置第i+1;
	}
	return error;//没有查找到元素e,查找失败
}

status listempty_sq(sqlist l)//判断sqlist是否为空
{
	if (l.length >0)
		return error;//不是空表,返回error
	else
		return ok;//是空表,返回ok

}

status freelist_sq(sqlist &l)
{
	if (!l.elem)
		return error;//如果已经是空表,则返回erro
	else
		free(l.elem);
	return ok;//销毁成功
}

status clearlist_sq(sqlist &l)//将sqlist置为空表
{
	l.length = 0;
	return ok;
}

status priorelem_sq(sqlist l, elemtype cur_e, elemtype &pre_e)//求cur_e的前驱,用pre_ef返回
{
	if (l.elem[0] == cur_e)
		return error;//第一个数据元素无前驱
	int i = 0;
	for (i = 1; i < l.length; i++)
	{
		if (l.elem[i] == cur_e)
		{
			pre_e = l.elem[i - 1];//pre_e为cur_e的前驱
			return ok;
		}
	}
	return error;//线性表中没有cur_e元素
}

status nextelem_sq(sqlist l, elemtype cur_e, elemtype &next_e)
{
	if (l.elem[l.length - 1] == cur_e)
		return error;//sqlist中的最后一个元素无后继;
	int i = 0;
	for (i = 0; i < l.length - 1; i++)
	{
		if (l.elem[i] == cur_e)
		{
			next_e = l.elem[i + 1];//返回cur的后一个元素
			return ok;

		}
	}
	return error;//sqlis中没有cur_e元素;
}

int listlength_sq(sqlist l)
{
	return (l.length);
}

status getelem_sq(sqlist l, int i, elemtype &e)
{
	if (i<1 || i>l.length)
		return error;//长度不合理
	e = l.elem[i - 1];
	return ok;//返回成功
}
int main()

{
	sqlist l;
	int i;
	elemtype e,m;
	if (ok == initlist_sq(l))
		printf("顺序表创建成功!\n");
	else
		printf("顺序表创建失败!\n");
	printf("请输入5个数字:");
	crealist_sq(l, 5);
	printf("原本的序列为:\n");
	print_sq(l);
	printf("在第二个位置插入元素99后的序列为:\n");
	listinsert_sq(l, 2, 99);
	print_sq(l);
	printf("此时线性表的长度为%d:\n", listlength_sq(l));
	printf("删除线性表中第二个元素后的序列为:\n");
	listdelete_sq(l, 2, e);
	print_sq(l);
	getelem_sq(l, 4, m);
	i = locateelem_sq(l, m);
	if (i)
		printf("%d是这个顺序表中的第%d个元素\n", m,i);
	else
		printf("顺序表中无此元素!\n");
	if (priorelem_sq(l, m, e))
		printf("%d的前驱为:%d\n",m, e);
	else
		printf("%d无前驱\n",m);
	if (nextelem_sq(l, m, e))
		printf("%d的后继为:%d\n", m, e);
	else
		printf("%d无后继!\n", m);
	if (freelist_sq(l))
		printf("顺序表销毁成功!\n");
	else
		printf("顺序表销毁失败!\n");
	clearlist_sq(l);
	if (listempty_sq(l))
		printf("此时的表是空表!\n");
	else
		printf("此时的表不是空表!\n");
	
	system("pause");
	return 0;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值