顺序表的操作及实现(C++)

顺序表的操作是大家在学习数据结构的第一个模块,也是最简单的一个。下列是顺序表的六种基本操作详解,希望能对您有所帮助~

1.建立一个顺序表,输入n个元素并输出

#define MAXSIZE 100//确定最大值
#define OK 1
#define ERROR 0
typedef struct//自定义顺序表类型
{
	int *elem;
	int length;
}sqlist;
int InitList(sqlist &l)
{
	l.elem = new int[MAXSIZE];//在堆区开辟MAXSIZE大小的空间
	if (!l.elem)
		exit (OVERFLOW);
	l.length = 0;//初始化l.length为0
	return OK;
}
void printfff(sqlist &l)//把顺序表的输出作为一个独立的函数,在输出时会多次用到
{
	int i=0;
	for (i = 0; i < l.length; i++)
	{
		cout << l.elem[i] << " ";
	}
	cout << endl;
}

2.查找线性表中的最大元素并输出

void findmax(sqlist &l)//查找最大值的函数名为findmax
{
	int i;
	int q = l.elem[0];
	for (i = 0; i < l.length; i++)
	{
		if (q < l.elem[i])
			q = l.elem[i];
	}//q等于顺序表中最大的元素
	cout << q << endl;//输出q
}

3.在线性表的第i个元素前插入一个正整数x

int ListInsert(sqlist &l, int i, int e)
{
	int j;
	if ((i < 1) || (i > l.length + 1))//i值表示在顺序表中的第几个位置上插入元素,不可能在i<1或i>l.lengh+1时成立。i若小于等于0,显然不可能,当i等于l.length+1时,代表直接在最后一个元素的后一位插入,则l.length+1成立。
		return ERROR;
	if (l.length == MAXSIZE)//元素的个数已经达到最大值
		return ERROR;
	for (j = l.length;j>=i;j--)
		l.elem[j] = l.elem[j - 1];//i位置后的元素都向后“挪”一位
	l.elem[i - 1] = e;//位置i的元素等于e
	++l.length;//千万不要忘了顺序表的长度加一
	return OK;
}

4.删除线性表中的第j个元素

int ListDelete(sqlist &l, int i)
{
	if ((i < 1) || (i > l.length))
		return ERROR;
	for (int j=i-1;j<l.length-1;j++)//i位置以后的元素都向前“挪”一位,i位置上的元素被覆盖
		l.elem[j] = l.elem[j+1];
	--l.length;//千万不要忘了顺序表的长度减一
	return OK;
}

5.将线性表中的元素按升序排列

按升序排列可以用排序算法,下面的代码实现用到的是冒泡排序

void sort(sqlist &l)
{
	int i,j;
	for (i = 0; i < l.length-1; i++)
	{
		for (j = 0; j < l.length-i - 1; j++)
		{
			if (l.elem[j] > l.elem[j + 1])
			{
				int temp = l.elem[j];
				l.elem[j] = l.elem[j+1];
				l.elem[j + 1] = temp;
			}
		}
	}
}

6.将线性表中的元素就地逆序(只允许用一个暂存单元)

void turn(sqlist &l)
{
	int a;//定义暂存空间
	for (int i = 0; i < l.length / 2; i++)//注意一定要将l.length除以二,不然得到的结果没有什么变化。读者可用i<l.length带入for循环中用几个数来举例。
	{
		a = l.elem[l.length - i - 1];
		l.elem[l.length - i - 1]=l.elem[i];
		l.elem[i] = a;
	}
}

如果大家还想知道顺序表的操作详解,欢迎评论告诉我~

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值