数据结构二维指针和数组还有数据结构文档格式.docx
《数据结构二维指针和数组还有数据结构文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构二维指针和数组还有数据结构文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
P=a;
p=&
a[0];
*p=a[0]
P+1=&
a[0+1]*(p+1)=a[0+1]注意取值时括号
指针与二维数组:
a[3][4]:
看做是有三个长度为4的以为一维数组组成的。
那么每一行的一维数组的数组名则分别为a[0]a[1]a[2]
首地址分别为a[0]a[1]a[2]
注意:
1.此时表示第一行第2个数值的地址表示为a[0]+1
数值表示为*(a[0]+1)
2.第三行的第四个值的地址表示为a[2]+3
值表示为*(a[2]+3)
在类中定义的函数体内,要对字符串或字符型赋值的时候要用strcpy(name,names)(将后面的传给前面的)
不过之一要加上#include<
string.h>
头文件
若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用容量最大的顺序表存储方式最节省运算时间。
在索引顺序表中查找一个元素,可用的且最快的方法是用二分查找法确定元素所在块,再用顺序查找法在相应块中查找
一个具有n个顶点的无向完全图的边数为n(n-1)/2
当初始序列已经按键值有序,用直接插入算法对其进行排序,需要循环的次数为n-1
二分查找要求被查找的表是键值有序的顺序表
若某线性表中最常用的操作是取第i个元素和找第i个元素的前趋元素,则采用顺序表存储方式最节省时间。
设数组Data[0..m]作为循环队列SQ的存储空间,front为队头指针,rear为队尾指针,则执行出队操作的语句为front=(front+1)%(m+1)
双链表中至多只有一个结点的后继指针为空。
对链表进行插入和删除操作时,不必移动结点。
栈可以作为实现程序设计语言过程调用时的一种数据结构。
向二叉排序树插入一个新结点时,新结点一定成为二叉排序树的一个叶子结点。
从逻辑结构上看,n维数组的每个元素均属于n个向量。
计算机算法必须具备三大特性可执行性、确定性、有穷性
一个从逻辑结构上看,n维数组的每个元素均属于n个向量。
是问题求解步骤的描述
在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法
数据项是数据的最小单位
健壮的算法不会因非法的输入数算法应该
据而出现莫名其妙的状态。
数据的物理结构包括数据元素的表示和数据元素间关系的表示。
数据的逻辑结构是指数据的组织形式,即数据元素之间逻辑关系的总体。
而逻辑关系是指数据元素之间的关联方式或称“邻接关系”。
。
一个数据结构在计算机中表示(又称映像)称为存储结构。
数据的逻辑结构反映数据元素之间的逻辑关系(即数据元素之间的关联方式或“邻接关系”)
数据的存储结构是数据结构在计算机中的表示,包括数据元素的表示及其关系的表示。
数据的运算是对数据定义的一组操作,运算是定义在逻辑结构上的,和存储结构无关,而运算的实现则是依赖于存储结构。
若逻辑结构相同但存储结构不同,则为不同的数据结构。
这样的说法对吗?
举例说明之。
答:
逻辑结构相同但存储不同,可以是不同的数据结构。
例如,线性表的逻辑结构属于线性结构,采用顺序存储结构为顺序表,而采用链式存储结构称为线性链表。
数据元素之间的关系在计算机中有几种表示方法(有几种存储结构)?
各有什么特点?
四种表示方法
(1)顺序存储方式。
数据元素顺序存放,每个存储结点只含一个元素。
存储位置反映数据元素间的逻辑关系。
存储密度大,但有些操作(如插入、删除)效率较差。
(2)链式存储方式。
每个存储结点除包含数据元素信息外还包含一组(至少一个)指针。
指针反映数据元素间的逻辑关系。
这种方式不要求存储空间连续,便于动态操作(如插入、删除等),但存储空间开销大(用于指针),另外不能折半查找等。
(3)索引存储方式。
除数据元素存储在一地址连续的内存空间外,尚需建立一个索引表,索引表中索引指示存储结点的存储位置(下标)或存储区间端点(下标),兼有静态和动态特性。
(4)散列存储方式。
通过散列函数和解决冲突的方法,将关键字散列在连续的有限的地址空间内,并将散列函数的值解释成关键字所在元素的存储地址,这种存储方式称为散列存储。
其特点是存取速度快,只能按关键字随机存取,不能顺序存取,也不能折半存取。
在给定的逻辑结构及其存储表示上可以定义不同的运算集合,从而得到不同的数据结构。
这样说法对吗?
栈和队列的逻辑结构相同,其存储表示也可相同(顺序存储和链式存储),但由于其运算集合不同而成为不同的数据结构。
评价好的算法有四个方面。
一是算法的正确性;
二是算法的易读性;
三是算法的健壮性;
四是算法的时空效率(运行)。
在分析算法时间复杂度时,有时需要估算基本操作的原操作,它是执行次数最多的一个操作,该操作重复执行的次数称为频度。
线性表
顺序存储结构的优点:
存储密度大
线性表采用顺序存储,便于进行插入和删除操作
设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用带头结点的双循环链表最节省时间。
若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。
则采用带头结点的双循环链表存储方式最节省运算时间。
顺序存储结构的主要缺点是不利于插入或删除操作。
为了很方便的插入和删除数据,可以使用双向链表存放数据。
线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的
链表是采用链式存储结构的线性表,进行插入、删除操作时,在链表中比在顺序存储结构中效率高。
线性表有两种存储结构:
一是顺序表,二是链表。
链式存储结构一般说克服了顺序存储结构的三个弱点。
首先,插入、删除不需移动元素,只修改指针,时间复杂度为O;
其次,不需要预先分配空间,可根据需要动态申请空间;
其三,表容量只受可用内存空间的限制。
其缺点是因为指针增加了空间开销,当空间不允许时,就不能克服顺序存储的缺点。
第三章栈和队列
对于栈操作数据的原则是:
后进先出
用链接方式存储的队列时:
1,入队时队尾向后移2,出队时队首向后移
栈和队列的区别:
栈:
先进后出,后进后出。
队列:
先进先出,后进后出。
第四章串
注意:
1,“”:
为空串
2,“”:
长度为1的串
3,“a”:
是一个字符串
4,‘a’:
是一个字符
串的长度是指串中所含字符的个数
第6章树和二叉树
性质一:
在二叉树的第i层上至多有2的(i-1)次方个结点(i>
=1)
性质二:
深度(高度)为k的二叉树至多有2的k次方减1个结点
性质三:
对任意一颗二叉树BT,如果其叶子结点个数为n,度为2的结点个数为m,那么n=m+1
满二叉树:
深度为k且有2的k次方减1个结点的二叉树
完全二叉树:
是深度为k的有n个结点的二叉树,如果其每个结点都与深度为k的满二叉树中编号从1至n的结点一一对应,则称为完全二叉树
二叉树只能先左边后右边
二叉树的遍历(分为三种):
1,先序遍历DRL
R=左子树D=根结点L=右结点
2,中序遍历RDL
3,后序遍历RLD
第六章图
图:
为多对多的逻辑结构
顶点的度=该顶点的入度+该顶点的出度
第七章查找
查找分为三种:
1,顺序查找
2,折半查找(类似于二分法)
3,分块查找
在索引顺序表中查找一个元素,可用的且最快的方法是:
用二分查找法确定元素所在块,再用顺序查找法在相应块中查找
双链表中至多只有一个结点的后继指针为空
对链表进行插入和删除操作时,不必移动结点
一,顺序查找:
最常用最简单的一种查找方法
监视哨:
从最后一个位置开始向前查找,并且下标为0的位置不存放有用的数据,而不是存放给定的值,这个位置被称作监视哨。
(当然也可以把监视哨放在最后,从前向后查找)
二,折半查找:
是高效的查找方法(这种查找需要表中的数据都必须按关键字有序的排列且只能采取顺序存储结构)
取中间值得公式:
mid=(low+high)/2“/”:
是取整符号。
三,分块查找:
介于顺序查找和折半查找之间的一种折中的查找方法,它不要求表中所有记录有序,但要求表中记录分块有序(块与块之间是有序的)
分块查找先是找到所在块,接着只能进行顺序查找(因为不要求块中程序有序)
第10章排序
怎么评价一个排序算法的好坏:
1,对n个记录排序执行时间的长短;
2,排序是所需辅助存储空间大大小
一,插入排序(直接插入排序希尔排序)
直接插入排序是一种稳定的排序方法
基本思想:
逐个按关键字的大小插入到一个已排序好的子序列中,知道全部记录插完为止。
(整个过程当中有序性是保持不变的)
操作步骤:
1.先将一个元素插入
2.将接下来的每个元素先放到监视哨中将其与序列李的元素进行比较,直到找到比它大的将其放在这个元素的前面,如果没有比他大的那就放在比它小的数后面
没完成一次记录的插入称为一趟排序,该排序算法中要解决的主要问题是怎么样插入,要保证插入后序列仍然有序。
二,折半插入排序
使用前面的折半查找算法。
三,交换排序(冒泡排序快速排序)重点的重点啊
冒泡排序
冒泡排序是一种简单的交换排序
冒泡排序是一种稳定的排序方法
是对排序序列的相邻记录的关键字进行比较,使较小关键字的记录往前移,而较大关键字记录向后移
主程序如下:
voidmaopao(RecDatar,intn)
{inti,j,swap,t;
for(i=0;
i<
n;
++i)
{swap=0;
for(j=1;
j<
n-i;
++j)
if(r[j+1].key<
r[i].key)
{t=r[j+1];
r[j+1]=r[j];
r[j]=t;
swap=1;
}
if(!
swap)
return;
}
}
快速排序
快速排序是对冒泡排序的一种改进
总结如下
(1)冒泡排序
冒泡排序就是把小的元素往前调或者把大的元素往后调。
比较是相邻的两个元素比较,交换也发生在这两个元素之间。
所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;
如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
(2)选择排序
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。
那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。
比较拗口,举个例子,序列58529,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。
(3)插入排序