#数据结构与算法分析(期末总复习1)

临近期末了,是时候该总结一哈数据结构与算法分析这门课了。在这里信安小萌新带大家一起重新温故整本书的所有知识点,顺便加深一哈自己的印象。希望能对临近期末要考数据结构的朋友们带来帮助!

第一章 绪论

数据结构的基本术语

——————我是分割线————————————
1、数据:
数据是信息的载体,能够被计算机程序识别加工、存储等处理的符号统称为数据。
2、数据元素:
组成数据的基本 单位称为数据元素或者结点,一个结点可以是一个字符、一个整数或者一个结构体,在计算机程序中,将结点看作一个整体进行处理。
3、数据项:
数据项是数据的不可分割的最小单位。一个数据元素可由多个数据项组成。
4、数据结构:
数据结构是存在相互关系的数据元素的集合。数据结构研究3个要素。即数据的逻辑结构、数据的存储结构、数据的操作。

——————我是分割线————————————————————————

什么是算法

算法必须要满足以下5个重要性
1、输入:
一个算法可以有一个或者多个输入,一个算法也可以没有输入。
2、输出:
一个算法可以有一个或多个输出,通常输入和输出之间有着某种特定的关系。
3、有穷性:
一个算法必须在执行有穷步骤后结束,求每一步在有穷的时间内完成。
4、确定性:
算法中的每一条指令必须有确定的含义,而又二义性,对相同的输入必须有相同的输出。
5、可行性:
算法中描述的操作必须可以通过以金属线的基本操作执行有限次来完成。
——————我是分割线——————————————

算法评价标准

1、正确性:
算法是针对具体需求设计的,应满足预先设定的功能和性能需求,要求对于给定的合法输入都要产生正确的输出。
2、可读性:
由于算法需要人来理解阅读并由计算机执行,因此算法因易于理解,已与编码和调试。
3、健壮性:
当用户的输入非法时,算法因能够识别并做出相应的反应或处理,而不是产生错误动作和陷入中断的状态。因此对应非法输入应返回错误标记以识别,以方便高层调用时能够作出处理。。
4、高效性:
理想情况时计算机无限快,储存器免费。但现实是不可能的,因此需要考虑时间效率和空间效率。时间效率是指算法运行需要的时间,显然时间代价越小越好。空间效率指算法执行需要的辅助存储空间数量。
——————我是分割线————————————

算法描述方法

1、自然语言
优点:通俗易懂
缺点:容易产生二义性
2、伪代码
伪代码是采用某种程序设计语言的基本语法,操作指令可以使用自然语言,通过计算机程序设计语言和自然语言的集合描述算法思路和步骤。
缺点:由于不涉及程序设计语言的实现细节部分,对读者来说无法通彻理解算法。
3、程序设计语言
用程序设计语言描述的算法能被计算机直接执行。
——————我是章节分割线——————————————————

第二章 线性表

线性表的概念

1、线性表的定义
线性表是由n(n大于等于0)个性质相同的元素组成的有限序列,n称之为线性表的长度。
———————我是分割线—————————————————————

线性表的抽象数据类型定义

线性表的主要操作包括创建空线性表、判断线性表是否为空,以及插入、删除和查找等基本操作。线性表的抽象数据类型定义如下:

ADT List is
operations
	List SetNullList(void)
	创建一个空的线性表
	int IsNull(List list)
	判断线性表list是否为空
	int InsertPre(List list,position p,Datatype x)
	在线性表中的第p个位置之前插入元素x
	int InsertPost(List list,position p,Datatype x)
	在线性表中的第p个位置之后插入元素x
	int DelIndex(List list,position p)
	删除线性表中第p个位置的元素
	int DelValue(List list,Datatyoe x)
	删除线性表中值为x的元素
	int LocateIndex(LIst list, Datatype x)
	在线性表中查找值为x的元素的位置
	int LocatePos(List list,Datatype x)
	在线性表中查找值为x的元素在内存中的位置
End ADT List

——————我是分割线——————————————————————————

顺序表VS链表

1、顺序表:
顺序表是用一组地址连续的存储单元依次存储线性表中个元素,通过位置来表示数据元素之间的线性逻辑关系。
2、链表:
链表使用一组任意的存储单元存储线性表中的各元素,通过指针来表示数据元素之间的线性逻辑关系。
顺序表和链表的C语言数据类型定义如下:

typedef int DataType
struct List
{
	int Max;          /*最大元素个数*/
	int n;           /*实际元素个数*/
	DataType*elem;  /*首地址*/
};
typedef struct List *SeqList;
//顺序表类型定义
typedef int DataType
struct Node
{
	DataType data;    /*数据域*/
	struct Node *next  /*指针域*/
};
typedef struct Node *PNode; /*结点类型定义*/
typedef struct Node *LinkList;
//单链表类型定义

需要先定义顺序表类型,再定义顺序表类型的变量,然后才使用该变量。
再链表中并不能反映出线性表的元素个数,需要通过遍历结点来确定元素个数
和线性表一样,需要定义链表类型的变量才能使用。

——————我是分割线——————————————————————————
遍历链表

viod Print(LinkList head)//输出带有头结点的单链表中的各个元素
{
	PNode p=head->next;//注意p的初值是头结点的后继
	while(p)
	{
		printf("%d\n",p->data);//输出数据域
		p=p->next;//顺着指针一次向后移动
	}
}

补充:理解typedef
在C语言中允许为一个数据类型起一个新的别名,使用关键字typedef可以为类型起一个新的别名,语法格式如下:
typedef OldName nexName;
——————我是分割线——————————————————

创建空的顺序表

创建空的顺序表就是为顺序表分配一个预先定义的数组空间,并将线性表的长度设置为零。
算法:顺序表的创建算法

SeqList SetNullList_Seq(int m)//创建空顺序表,m为顺序表的最大值
{
	SeqList slist=(SeqList)malloc(sizeof(struct List));
	//申请结构空间
	if(slist!=NULL)
	{
		slist->elem=(DataType*)malloc(sizeof(DataType)*m);
		//申请顺序表空间,大小为m个DataType空间
		if(slist->elem)
		{
			slist->Max=m;//顺序表的最大值
			slist->n=0//顺序表长度赋值为
			return(slist);
		}
		else free(slist);
	}
	printf(" Alloc failure!\n");
	return NULL;
}

——————我是分割线——————————————————————————

判断顺序表为空

判断顺序表是否为空,如果为空,返回1,否则返回,通过检查顺序表的长度可以容易的判断。
算法:顺序表的判空

int IsNullList_seq(Seqlist slist)//判断顺序表是否为空
{
	return(slist->n==);
}

补充:理解malloc
原型:extern void *malloc(unsigned int num_bytes)。
头文件:#include <stdlib.h>或者#include<malloc.h>
————————我是分割线————————————————————————

插入算法

算法:顺序表的插入算法

int InsertPre_seq(SeqList slist,int p, DataType x)
{
	//在线性表slist的p位置之前插入x,如果成功,返回1,否则返回0
	int q;
	if(slist->n>=slist->Max)//顺序表满溢出
	{
		printf("overflow");
		return 0;
	}
	if(p<0||p>slist->n)
	{
		printf("not exist!\n");//不存在下标为p的元素
		reeturn 0;
	}
	for(q=slist->n-1;q>=p;q--)//插入位置以及之后的元素后移
		slist->elem[q+1]=slist->elem[q];
	slist->elem[p]=x;//插入元素x
	slist->n=slist->n+1;//顺序表长度加1
		return 1;
}

顺序表越长,时间代价越大
——————我是分割线——————————————————————————

删除算法

算法:顺序表的删除算法

int  DelIndex_seq(SeqList slist,int p)//删除下表为p的元素
{
	int q;
	if(p<0||p>=slist->n)//不存在下标为p的元素
	{
		printf("Not exist\n");
		return 0;
	}
	for(q=p;q<list->n-1;q++)//p位置之后的元素向前移动
	{
		slist->elem[q]=slist->elem[q+1];
	}
	slist->n=slist->n-1;//顺序表长度减1
	return 0;
}

在顺序表中进行删除操作平均需要移动一般的元素。顺序表越长时间代价越大
————————我是分割线——————————————————————
信息安全小萌新注:
今天先到此为止后续我会陆续发出来,还望此篇文章能对大家有一定的帮助,萌新们可以尝试着自己写写博客,总结最近的知识点,到后面也方便自己查看。。。。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值