数据结构的学习(线性表-顺序存储)

博主最近复习考研,开始对数据结构进一步的巩固和学习,有时间会将一些学习结论总结到这里,做成系列。如果大家看到博主的内容存在错误的时候欢迎指正。
文章预告:本篇主要是讲述线性表的顺序存储结构(顺序表).

数据结构的相关概念

  1. 数据结构前面需要了解的相关概念。
    数据结构主要是研究数据的逻辑结构数据的物理结构数据的运算
    数据的逻辑结构主要是分为集合线性结构图状结构树状结构。逻辑结构是我们在实际的生活当中将数据划分成的结构。
    数据的物理结构主要是分为顺序存储链式存储索引存储散列存储。物理结构是数据实际存储的形式。
    数据的运算是施加在数据上的运算包括数据的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对物理结构的,指出运算的具体操作步骤。

顺序表

  1. 线性结构的研究(集合一般是不做考察的)。在线性结构中我们要了解的有线性表、队、栈、字符串、数组。
  2. 线性表有两种物理结构分别是顺序表和链表(单链表、双链表、循环链表、静态链表)。
  3. 顺序表性的定义方式有两种静态分配方式动态分配方式
//静态分配方式
#include <stdio.h>
#define MaxSize 10                      //定义最大长度
typedef struct{
	int data{MaxSIze};			        //用静态的“数组”存放数据
	int length;					        //顺序表的当前长度
}SqList;								//顺序表的类型定义
//初始化一个顺序表
void InitList(SqlList  &L){				//初始化一个线性表使用的是InitList
	for(int i=0;i<MaxSize;i++)			//使用for循环将线性表中的静态数组都赋初始值
		L.data[i]=0;					//每个数据都需要初始化为0
	L.length=0;           				/顺序表的初始长度为0
}
==================================================================
本段小代码需要注意的是数据如果只是申请了存储空间但是没有赋初值的话可能会有脏数据产生。

//动态分配方式
#include <stdio.h>  		//想要使用malloc函数就一定要引用这个包
#define InitSize 10     	//设置默认的最大长度
typedef struct{				
	int *data;					//指示动态分配的数组的指针
	int MaxSize;				//顺序表的最大容量
	int length;					//顺序表的当前长度
}SqList;


void InitList(SqList &L){
	L.data=(int*)malloc(InitSize*sizeof(int));
	int length=0;
    L.MaxSize=InitSize;
}

//增加动态数组的长度
void IncreaseSize(SqList &L,int len){
	int *p=L.data;
	L.data =(int*)malloc((L.MaxSize+len)*sizeof(int));
	for(int i=0;i<L.length;i++){
		L.data[i}=p[i];		  	//将之前初始化的数据复制到新申请的空间里面
		}
	L.MaxSize=L.MaxSize+len;	//将数据的最大容量增加len
	free(p);					//释放原来的内存空间
}
===================================================================

顺序表的特点:
随机访问,可以在O(1)时间内找到第i个元素
存储密度高,每个节点只存储数据元素
扩展容量不方便(即便是采用动态分配的方式,时间复杂度也是比较高的)
插入、删除操作不方便,需要移动大量元素

  1. 顺序表的插入和删除
//顺序表的插入
bool ListInsert(SqList &L,int i.int e){
	if(i<1||i>L.length+1)  			//判断i的值输入是否合法
		return false;
	for(L.length>=L.MaxSzie) 		 //当前的存储空间已满,不能插入
		return false;
 	for(int j=L.length;j>=i;j--)  	//将第i个元素及之后的元素后移
		L.data[j]=L.data[j-1];
	L.data[i-1]=e;   				//j将位置i-1处放入元素值e
	L.length++;						//将线性表的长度加1
	return true;
}
顺序表插入的时间复杂度:最好是O(1)、最坏是O(n)、平均是O(n)

===================================================================
//线性表的删除
bool ListDelete(SqList &L,int i,int &e){
	if(i<1||i>L.length+1)			//判断输入的i值是否合法
		return false;
	e=L.data[i-1];					//将被删除的元素赋值给e
	for(int j=i;j<L.length;j++)
		L.data[j-1]=L.data[j];		//将第i个位置之后的元素前移
	L.length--;						//将顺序表的长度减1
	return true;
}
int main(){
	SqList L;
	InitList(L);
	.....//此处添加几个元素
	int e=-1;  						//用变量e将删除的元素带回来
	if(ListDelete(L,3,e))
		printf("已删除的元素值为=%d\n",e);
	else
		printf("已删除的元素不合法\n")
	return 0;
}
顺序表删除的时间复杂度:最好O(1)、最坏O(n)、平均O(n)
参数必须要加引用符号
  1. 顺序表的查找主要分为按值查找(分为静态分配查找和动态分配查找)和按位查找。
//静态分配按值查找
#define MaxSize 10					//定义最大长度
typedef struct{
	int data[Maxsize];			//使用静态的数组存放数据元素
	int length;						//顺序表的当前长度
}SqList;

ElemType GetElem(SqList L,int i){	
	return L.data[i-1];
}
===================================================================
//动态分配按值查找
#define InitSize 10					//定义顺序表的当前长度
typedef struct{						
	int  *data;						//指示动态分配数组的指针
	int length;						//顺序表的当前长度
	int MaxSzie;					//顺序表的最大长度
}SqList;

ElemType GetElem(SqList L,int i){
	return L.data[i-1];
}
===================================================================
//按值查找
//在顺序表L中查找第一个元素值为e的元素,并返回其位序
int  LocateElem(SqList L,ElemType e){
	for(int i=0;i<L.length;i++)
		if(L.data[i]==e)
			return i+1;				//返回查找到的的元素值为e的元素,并返回其位序i+1
	return 0;							//退出循环说明其查找失败
}
===================================================================
按位查找的时间复杂度最好最坏平均都是O(1)
按值查找的时间复杂度最好是O(1)、最坏和平均时间复杂度是O(n)
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页