【数据结构】-线性表

线性表

我是说明==
工作考研狗复习而已,平常写的都是java,突然转c有点懵,写的也可能不规范。有错大家指正,玻璃心别喷我!!!!后期可能会整理黑皮书java版的算法与数据结构

声明:不会解释基础概念,想看自己百度或者自己买书

复习资料(部分非全名)为:

王道数据结构》

清华大学出版社《数据结构(C语言版)》严蔚敏 吴伟民编著

知识是有价的,这只是我的整理资料,需要好好复习或学习的自己买书!!!

多好的书!!!一定要买它!!买它!!买它!!

一、线性表的类型和定义

1.线性表抽象类型定义

ADT List{
	数据对象:D={ai | ai ∈ ElementSet, i = 1,2,...,n,n≥0} 
	数据关系:R1={<ai-1,ai>|ai,ai∈ D,i = 2,...,n}
	基本操作:
		InitList(&L)
			操作结果:构造一个空的线性表;
			
		DestoryList(&L)
			初始条件:线性表L已存在;
			操作结果:销毁线性表L;
			
		ClearList(&L)
			初始条件:线性表L已存在;
			操作结果:将L重置为空表;
			
		ListEmpty(L)
			初始条件:线性表L已存在;
			操作结果:若L为空表,则返回TRUE,否则返回FALSE;
		
		ListLength(L)
			初始条件:线性表L已存在;
			操作结果:返回L中数据元素个数;
		
		GetElem(L,i,&e)
			初始条件:线性表L已存在,1≤i≤ListLength(L)
			操作结果:用e返回L中数据元素个数;
		
		LocateElem(L,e,compare())
			初始条件:线性表L已存在,compare()是数据元素判定函数;
			操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。若这样的数据元素不存在,则返回值为0;
		
		PriorElem(L,cur_e,&pre_e)
			初始条件:线性表L已存在;
			操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义;
			
		NextElem(L,cur_e,&next_e)
			初始条件:线性表L已存在;
			操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义;
			
		ListInsert(&L,i,e)
			初始条件:线性表L已存在,1≤i≤ListLength(L)+1;
			操作结果:在L中第i个位置之前插入新的数据元素e,L的长度+1
		
		ListDelete(&L,i,&e)
			初始条件:线性表L已存在且非空,1≤i≤ListLength(L);
			操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1
			
		ListTraverse(L,visit())
			初始条件:线性表L已存在;
			操作结果:依次对L的每个数据元素调用函数visit(),一旦visit()失败,则操作失败
			
} ADT List
例2-1 合并A,B两个线性表,生成一个新表A

时间复杂度 O(ListLength(LA) X ListLength(LB))

题目 假设利用两个线性表LA和LB分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的集合A= A∪B.

分析 则需要如下操作:

​ 1.扩大线性表LA

​ 2.将存在于线性表LB中而不存在与线性表LA中的插入到线性表LA中去

只要从线性表LB中依次取得每个数据元素,并依值在线性表LA中进行查访,若不存在,则插入

void union(List &La,List Lb) {
	//将所有在线性表Lb中但不在La中的数据元素插入到La中
	
	//线性表LA的长度
	La_len = ListLength(La);
	
	//线性表LB的长度
	Lb_len = ListLength(Lb);
	
	//只要从线性表LB中依次取得每个数据元素,并依值在线性表LA中进行查访,若不存在,则插入
	for(i=1;i<=Lb_len;i++){
	
		//获取Lb中第i个数据元素赋给e
		GetElem(Lb,i,e);
		
		//遍历La,若La中不存在和e相同的数据元素,则插入之
		if(!LocateElem(La,e,equal))ListInsert(La,++La_len,e);
	}
}
例2-2 合并A.B生成有序表C

时间复杂度为 O(ListLength(LA) + ListLength(LB))

题目 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素仍按值非递减有序排列。

分析 LC中的数据元素或是LA中的数据元素,或是LB中的数据元素,则只要先设LC为空表,然后将LA或LB中的元素逐个插入到LC中

操作 为使LC中元素按值非递减有序排列,可设两个指针i和j分别指向LA和LB中某个元素。

//书上的代码,但作为工作狗的我。。。感觉需要给LA和LB加个判定。。。那个非空注释。。emmm。。。

void MergeList(List La,List Lb,List &Lc){
	//已知线性表La和Lb中的数据元素按值非递减排列
	//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列;
	
	//构造一个新的空表Lc
	InitList(Lc);
	
	//定义变量i,j,k
	i = j = 1; 
	k = 0;
	
	//线性表LA的长度
	La_len = ListLength(La);
	
	//线性表LB的长度
	Lb_len = ListLength(Lb);
	
	while((i <= La_len)&&(j<= Lb_len)){//La 和 Lb均非空
	
		//获取La中第i个数据元素赋给ai
		GetElem(La,i,ai);
		
		//获取Lb中第j个数据元素赋给bj
		GetElem(Lb,j,bj);
		
		//判断插值
		if(ai<= bj) {
			ListInsert(Lc,++k,ai);
			++i;
		}else{
			ListInsert(Lc,++k,bj);
			++j;
		}
	}
	while(i<= La_len){
		//获取La中第i个数据元素赋给ai
		GetElem(La,i,ai);
		
		ListInsert(Lc,++k,ai);
	}
	while(j<= Lb_len){
		//获取Lb中第j个数据元素赋给bj
		GetElem(Lb,j,bj);
		ListInsert(Lc,++k,bj);
	}
}

加了判定非空的

void MergeList(List La,List Lb,List &Lc){
	//已知线性表La和Lb中的数据元素按值非递减排列
	//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列;
	
	//构造一个新的空表Lc
	InitList(Lc);
	
	//定义变量i,j,k
	i = j = 1; 
	k = 0;
	
	if(ListEmpty(La) || ListEmpty(Lb)){
		prinf("Error,list is empty");
		exit;
	}else{
		
		//线性表LA的长度
		La_len = ListLength(La);
	
		//线性表LB的长度
		Lb_len = ListLength(Lb);
	
		while((i <= La_len)&&(j<= Lb_len)){//La 和 Lb均非空
	
			//获取La中第i个数据元素赋给ai
			GetElem(La,i,ai);
		
			//获取Lb中第j个数据元素赋给bj
			GetElem(Lb,j,bj);
		
			//判断插值
			if(ai<= bj) {
				ListInsert(Lc,++k,ai);
				++i;
			}else{
				ListInsert(Lc,++k,bj);
				++j;
			}
		}
		while(i<= La_len){
			//获取La中第i个数据元素赋给ai
			GetElem(La,i,ai);
		
			ListInsert(Lc,++k,ai);
		}
		while(j<= Lb_len){
		
			//获取Lb中第j个数据元素赋给bj
			GetElem(Lb,j,bj);
			
			ListInsert(Lc,++k,bj);
		}
	}	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
线性是一种常见的数据结构,它示具有相同数据类型的一组元素的有序序列。线性中的元素之间存在一种顺序关系,每个元素都有一个前驱和一个后继(除了第一个元素没有前驱,最后一个元素没有后继)。线性可以用顺序存储结构或链式存储结构实现。 在顺序存储结构中,线性的元素按照顺序存储在连续的内存空间中,可以通过元素的下标来访问和操作元素。插入或删除元素时,需要移动其他元素,因此操作的时间复杂度较高。 链式存储结构中,线性的每个元素都包含一个数据域和一个指针域,指针指向下一个元素。通过指针的链接,元素可以按照任意顺序存储在内存中,插入和删除操作只需要改变指针的指向,因此时间复杂度较低。 线性常见的操作包括插入、删除、查找、获取长度等。其中插入和删除操作需要注意保持线性的顺序关系。 常见的线性有数组、链、栈和队列。数组是最简单的线性,通过下标可以直接访问元素;链是动态存储结构,插入和删除操作方便,但访问元素需要遍历链;栈是一种特殊的线性,只允许在的一端进行插入和删除操作;队列也是一种特殊的线性,只允许在的一端进行插入操作,在另一端进行删除操作。这些数据结构在实际应用中都有各自的应用场景和优缺点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值