基本数据结构----线性表

数据结构第一期(线性表)

hello,大家好,今天给大家带来一期数据结构线性表题目的解析



前言

数据结构作为计算机的基础学科,也是很多人比较头疼的东西,所以准备出一期基础教程,由于帖主也是个新手,所以希望大家可以一起进步,还有不足的地方还望大家批评指正!话不多说,进入今天的正题。


一、数据结构是什么?

数据结构(data structure)是计算机中存储、组织数据的方式,引用数据结构 一书中的术语就是相互之间存在一种或者多种特定关系的数据元素的集合。

数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。

不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。

二、线性表的介绍

线性表是最简单的一个数据结构,线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,n为表长,n=0时线性表为空表,若用L命名线性表,一般表示为:
L = ( a 1 , a 2 , a 3 . . . a i , a i + 1 , . . . a n ) L = (a_1,a_2,a_3... a_i,a_{i+1},...a_n) L=(a1,a2,a3...ai,ai+1,...an)
其中a1是唯一的“第一个"数据元素",称为表头元素,当然,就是唯一的“最后一个"数据元素",称为表尾元素,除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。

三、线性表的特点

  • 表中元素个数有限
  • 表中元素具有逻辑上的顺序性,表中元素有其先后次序
  • 表中元素都是数据元素,每个元素都是单个元素
  • 表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间
  • 表中元素具有抽象性,即仅讨论元素之间的逻辑关系,而不考虑元素究竟表示什么内容

四、题目解析

1.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表

1.1算法分析

  • 题目要求两个有序顺序表合并,因此共需要三个线性表,假设现在定义三个表A,B,C,C表用来存合并之后的元素,首先需要明确一点的是,1.如何比较?2.定义几个变量?3.怎么实现?
  • 带着这些问题再看题,需要定义三个变量,肯定需要先找到A,B两个表的表头元素,因为表是有序的,所以只需要比较表头元素就好了,那现在前两个问题就解决了,需要定义三个变量,i和j分别用来充当A,B的指针,k用来当C的指针,对于最后一个问题,首先需要比较AB两表的首元素大小,把小的加到C中,接着继续操作不断比较将元素加入C中,但是,现在就出现了一个问题,如果A,B有剩余怎么办?
  • 这就很简单了,看哪个表有剩余元素就把元素加到C中就行了。到此,题目解析完毕!

用C语言实现如下:

1.1.1定义结构体(可以自行定义)
#define MaxSize 50
struct SeqList {
    int* data;
    int length;
    int maxSize;
};
1.1.2实现总体算法
bool Merage(SeqList A, SeqList B, SeqList& C) {
    //如果两表长度大于新表,返回退出
	if (A.length + B.length > C.maxSize) {
		return false;
	}
	int i = 0, j = 0, k = 0;
	//实现首元素排序,并存入
	while (i < A.length && j < B.length) {
		if (A.data[i] <= B.data[j])
			C.data[k++] = A.data[i++];
		else
			C.data[k++] = B.data[j++];
	}
	//检查剩余,并将剩余加入到新表中
	while (i < A.length)
		C.data[k++] = A.data[i++];
	while (j < B.length)
		C.data[k++] = B.data[j++];
	//新表长度
	C.length = k;
	return true;
}

2.从有序顺序表删除其值在给定值s与t之间(要求s<t)的所有元素,若s与t不合理或者顺序表为空。显示错误信息并退出运行。

2.1算法分析

  • 与上一题一致,首先思考问题,依旧是有序表,如何实现算法?需要定义几个变量?很明显一个变量k就可以了,很简单,如果是在s到t的范围内,每次k就加1,k不仅充当了计数器,也很方便的控制了表的长度,让表不会有冗余。每次加1过后,直接移动到新位置,也就实现删除功能,到此,第二题分析完毕!

实现的c语言代码如下:

1.1.1定义结构体(可以自行定义)
// 定义元素类型 ElemType
typedef int ElemType;

// 定义 SeqList 结构体
struct SeqList {
    ElemType* data;  // 数据数组
    int length;      // 当前长度
    int maxSize;     // 最大容量
};

1.1.2实现总体算法
bool del_x_4(SeqList& L, ElemType s, ElemType t) {
	// 如果列表为空或者范围无效,则返回 false
	if (L.length == 0 || s >= t) {
		return false;
	}
	int k = 0;  // 初始化计数器 k 为 0
	// 遍历列表
	for (int i = 0; i < L.length; i++) {
		// 如果元素值位于 [s, t) 范围内,则增加 k 的值
		if (L.data[i] >= s && L.data[i] <= t) {
			k++;
		}
		// 将未被删除的元素移到新的位置
		L.data[i - k] = L.data[i];
	}
	// 减少列表的长度
	L.length -= k;
	return true;  // 成功删除元素
}

总结

以上内容就是今天要讲的内容了,主要介绍了数据结构最简单的结构,线性表,也对两个UP主认为比较经典的题目进行了解析,之后我会继续更新这方面的内容,大家如果感兴趣的话,如果有想看的内容,请在评论区告诉我!,别忘了给UP主一个关注,你的关注是我更新的动力!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值