数据结构顺序表练习题1(基础篇)

实验要求:
  (1)构造按升序排列的顺序表A(12,25,34,78, 88,100) 和顺序表 B(10,15,25,32,88)(说明: 顺序表A, B的数据元素值按升序有序的方式从键盘输入或从文件读入)。
     (2)将数据元素38插入顺序表A中并保持其原来的升序排列,成功返回1,失败返回0。
        (3)删除顺序表B中位序为3的数据元素,成功返回1,失败返回0。
     (4)从键盘输入一个数X, 并在顺序表A中查找与X相等数据元素,并输出该元素在线性表中的位序。

基础的初始化,销毁,输出等功能的代码省略,博主以前的文章有提到,可以自行查阅。

代码实现:

插入操作:

int InsertList_Sq(SqList& L, int temp)
{
	//顺序表扩容
	ElemType* newbase = new ElemType[L.listsize + LISTINCREMENT];

	for (int i = 0; i < L.length; i++)
		newbase[i] = L.elem[i];

	delete[]L.elem;
	L.elem = newbase;
	L.listsize += LISTINCREMENT;
	newbase = NULL;

	//暴力查找
	int j = 0;
	for (; j < L.length - 1; j++)  //从LB中第一个元素遍历
	{
		if (temp < L.elem[j])
		{
			j--; break;
		}
		if ((temp >= L.elem[j]) && (temp < L.elem[j+1]))  //找到比38小和比38大的两个元素
			break;
	}

	//二分查找
	//if (temp > *(L.elem + L.length - 1))  j = L.length + 1;
	//else {
	//	int left = 0, right = L.length - 1;
	//	while (left < right)
	//	{
	//		int mid = left + (right - left) / 2;
	//		if (temp > *(L.elem + mid))
	//			left = mid + 1;
	//		else  right = mid;
	//	}j = left;
	//}
	//ElemType* q = L.elem + j; 

	ElemType* q = L.elem+j+1; //插入元素的指针表示
	ElemType* p = L.elem + L.length - 1;
	for (; p >= q; p--) 
		*(p+1) = *p;  //插入位序以后元素依次后移

	*(p+1) = temp;
	++L.length;

	return j+1;
}
//边比较边后移
// int n = *(L.elem + L.length+1)=temp;  //将待插入元素放在表尾
// int i = 0;
// 
// for (i = L.length; i > 0; i--)  //从表尾向前遍历
// {
//		if (L.elem[i - 1] < n)
//			break;
//		*(L.elem + i) = *(L.elem + i - 1);
// }
// *(L.elem + i) = n;
// L.length++;
// return i;

删除操作:

int ListDelete_Sq(SqList& L, int i, ElemType& e)
{
	if ((i < 1) || (i > L.length)) return ERROR;

	ElemType* p = &(L.elem[i - 1]);
	e = *p;
	ElemType* q = L.elem + L.length - 1;

	for (++p; q >= p; ++p)
		*(p - 1) = *p;
	--L.length;

	return OK;
}

实验结果:

本文共写了两种插入方法,两种查找方法,易于理解,欢迎大佬们提出宝贵建议!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发光零壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值