顺序表一定要掌握的一些操作(c语言)

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
#include<stdio.h>
typedef int ElemType;

typedef struct  integer
{
	ElemType* elem; //存储空间的基地址
	int length; //当前长度
} SqList;


//初始化一个顺序表(顺序表最大单元数为100)
Status InitList_Sq(SqList& L)
{
	//构造一个空的顺序表L

	L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
	if (!L.elem)
		exit(OVERFLOW); //存储分配失败退出
	L.length = 0; //空表长度为0

	return OK;
}


//2.线性表的插入(在第i个位置插入元素e)
Status ListInsert_Sq(SqList& L, int i, ElemType e)
{
	if ((i < 1) || (i > L.length + 1))
		return ERROR;//i值不合法
	if (L.length == MAXIZE)
		return ERROR;//存储空间已满
	for (int j = L.length - 1; j >= i - 1; j--)
	{
		L.elem[j + 1] = L.elem[j];//插入位置及以后的元素往后移
	}
	L.elem[i - 1] = e;//在第i个位置插入e
	++L.length;//表长+1

	return OK;
}


//3.线性表的构造。通过输入构造含有n个元素的的线性表
void  Create_list(SqList& L, int n)
{
	for (int j = 1; j <= n; j++)
	{
		scanf("%d", &e);
		ListInsert_Sq(L, j, e);
	}
}


/*4.线性表的输出。按照线性表的逻辑顺序输出给定的顺序表中的元素。

算法步骤:逐个输出线性表中的元素*/
void print_list(SqList L)
{
	for (i = 0; i < L.length; i++)
	{
		printf("%d\n", L.elem[i]);
	}
}


/*5.线性表的查找。在给定的顺序表上查找元素e,若找到,函数返回值为其在表中的位置,否则返回-1。

算法步骤:遍历顺序表中的每个元素,将其与元素e比较,若相等则返回其位置,否则返回-1*/
int find_list(SqList L, ElemType e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e)
			return i + 1;
	}
	return -1;
}


/*6.线性表的插入。在给定的顺序表中的第i个位置插入一个元素e,
使得插入以后的元素成为表中第i个元素。插入成功返回值为1,否则返回值为0。

算法步骤:1.判断i是否合法?存储空间是否满了?(健壮性)
2.将第i个位置及其以后的元素逐个往后移一位,从最后一个元素开始。3.将元素e插入第i个位置
4.判断第i个位置是否为元素e,如果是,返回1,否则返回0*/
int  insert_list(SqList& L, int i, ElemType e)
{
	ListInsert_Sq(L, i, e);
	if (L.elem[i - 1] == e)
		return OK;
	else
		return ERROR;
}


/*7.线性表的删除。在给定的顺序表中删除第i个元素。删除成功返回1,否则返回0。

算法步骤:1.判断i的合法性 2.第i+1个位置及其以后的位置逐个往前移一位,从第i+1个位置的元素开始
3.表长减1. 4.判断第i个位置的元素与之前是否相等,若不相等,返回1,否则返回0*/
int del_list(SqList& L, int i)
{
	if ((i < 1) || (i > L.length))
		return ERROR;
	ElemType e = L.elem[i - 1];
	for (int j = i - 1; j < L.length - 1; j++)
		L.elem[j] = L.elem[j + 1];
	L.length--;
	if (L.elem[i - 1] == e)
		return ERROR;
	else
		return OK;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值