当前位置:文档之家› 数据结构课程总结和思考

数据结构课程总结和思考

数据结构课程总结和思考
数据结构课程总结和思考

XX大学

数据结构总结

姓名:

专业班级:

学号:

任课教师:

完成时间:

目录

☆学习总结 (3)

☆对赫夫曼树的研究 (5)

?赫夫曼树的基本定义 (5)

?赫夫曼树的构造 (5)

?动态赫夫曼编码的实现 (11)

☆对各类排序方法的总结 (16)

☆学习感悟 (18)

☆学习总结

学习数据结构之前、一直以为数据结构是一门新的语言、后来才知道学习数据结构是为了更加高效的的组织数据、设计出良好的算法,而算法则是一个程序的灵魂。经过了一学期的数据结构了,在期末之际对其进行总结。首先,学完数据结构我们应该知道数据结构讲的是什么,数据结构课程主要是研究非数值计算的研究的程序设计问题中所出现的计算机处理对象以及它们之间关系和操作的学科。

第一章主要介绍了相关概念,如数据、数据元素、数据类型以及数据结构的定义。其中,数据结构包括逻辑结构、存储结构和运算集合。逻辑结构分为四类:集合型、线性、树形和图形结构,数据元素的存储结构分为:顺序存储、链接存储、索引存储和散列存储四类。最后着重介绍算法性能分析,包括算法的时间性能分析以及算法的空间性能分析。

第二章具体地介绍了顺序表的定义、特点及其主要操作,如查找、插入和删除的实现。需要掌握对它们的性能估计。包括查找算法的平均查找长度,插入与删除算法中的对象平均移动次数。

链表中数据元素的存储不一定是连续的,还可以占用任意的、不连续的物理存储区域。与顺序表相比,链表的插入、删除不需要移动元素,给算法的效率带来较大的提高。链表这一章中介绍了链表的节点结构、静态与动态链表的概念、链表的基本运算(如求表长、插入、查找、删除等)、单链表的建立(头插法和尾插法)以及双向循环链表的定义、结构、功能和基本算法。

第三章介绍了堆栈与队列这两种运算受限制的线性结构。其基本运算方法与顺序表和链表运算方法基本相同,不同的是堆栈须遵循“先进后出”的规则,对堆栈的操作只能在栈顶进行;而队列要遵循“先进先出”的规则,教材中列出了两种结构的相应算法,如入栈、出栈、入队、出队等。在介绍队列时,提出了循环队列的概念,以避免“假溢出”的现象。

算法上要求掌握进栈、退栈、取栈顶元素、判栈空盒置空栈等五种操作及掌握使用元素个数计数器及少用一个元素空间来区分队列空、队列满的方法。

第四章串和数组中,我们知道串是一种特殊的线性表,是由零个或多个任意字符组成的字符序列。串的储存结构分为紧缩模式和非紧缩模式。

基本运算需掌握求串长、串赋值、连接操作、求子串、串比较、串定位、串插入、串删除、串替换等。

第六章二叉树的知识是重点内容。在介绍有关概念时,提到了二叉树的性质以及两种特殊的二叉树:完全二叉树和满二叉树。接着介绍二叉树的顺序存储和链接存储以及生成算法。重点介绍二叉树的遍历算法(递归算法、先序、中序和后序遍历非递归算法)和线索二叉树。二叉树的应用:基本算法、哈弗曼树、二叉排序树和堆排序。

树与二叉树是不同的概念。教材介绍了树和森林的概念、遍历和存储结构,还有树、森林和二叉树的相互关系,树或森林怎样转化成二叉树,二叉树又如何转换为树和森林等算法。

第七章介绍了图的概念及其应用,图的存储结构的知识点有:邻接矩阵、邻接表、逆邻接表、十字链表和邻接多重表。图的遍历包括图的深度优先搜索遍历和广度优先搜索遍历。其余知识点有:有向图、连通图、生成树和森林、最短路径问题和有向无环图及其应用。有向无环图重点理解AOV网和拓扑排序及其算法。

最后两章集体说明了查找和排序算法,查找教材上介绍了静态查找表和哈希查找表,静态查找表中介绍了顺序查找、折半查找以及分块查找。哈希法中,学习要点包括哈希函数的比较;解决地址冲突的线性探查法的运用,平均探查次数;解决地址冲突的二次哈希法的运用。

排序是使用最频繁的一类算法,可分为内部排序和外部排序。主要需要理解排序的基本概念,在算法上、需要掌握插入排序(包括直接插入排序算法、折半插入排序算法),交换排序(包括冒泡排序算法、快速排序递归算法),选择排序(包括直接选择排序算法、堆排序算法)等。

由于平时上机练习的少,对于教材中很多算法都掌握的不是很熟悉、不过这些都是可以弥补的,我会在剩下的时间中不断练习书上给出的算法和练习,正如教材上说的,学习数据结构,仅从书本上学习是不够的,必须经过大量的程序设计实践,在实践中体会构造性思维方法,掌握数据组织与程序设计技术。

以上就是我这学期对数据结构学习的总结。

☆对赫夫曼树的研究

?赫夫曼树的基本定义

赫夫曼树(Huffman )又称最优二叉树,是一类带权路径长度最短的树,有着广泛的应用。首先需要弄清楚关于路径和路径长度的概念。树中两个结点之间的路径由一个结点到另一结点的分支构成。两结点之间的路径长度是路径上分支的数目。树的路径长度是从根结点到每一个结点的路径长度之和。

?赫夫曼树的构造

(1)构成初始集合

对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。)

(2)选取左右子树

在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。

(3)删除左右子树

从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。

(4)重复左右两步

重复二和三两步,直到集合F中只有一棵二叉树为止。

◎举个例子

有个序列是(7,9,2,6,32,3,21,10),求赫夫曼树

步骤一:把这些点都看成是一个只有根结点的树的集合F

步骤二:选2个值最小的树

步骤三:在这些树的集合F中删除这2棵树

然后把2,3 构成一颗二叉树

变成了(5 = 2 + 3)

然后把这个树加入到集合F

5代表这棵树的权值

然后继续上述步骤

选择5和6,把这2个构成二叉树。如下图:

在F中删除5、6 ,并加入11这棵树,变成了:

继续上述步骤

选7 和9

在F中删除7 和9,并加入16这棵树,则数变成了:

继续上述步骤

选10 和11

在F中删除10 和11 加入21这棵树

继续上述步骤

选16和21 ,构成二叉树

在F中删除这16和21这两棵树,加入37这棵树

继续上述步骤

选21和32,构成二叉树

在F中删除21和32这2两棵树,加入53这棵树

还是继续上面步骤把F中的两棵树合并成一棵树

赫夫曼树就构造完成了。

?动态赫夫曼编码的实现

所谓动态赫夫曼编码,指的就是每一个结点的权是不定的,那么在实现时,

就以从键盘输入结点个数及权的值作为参考,实现动态赫夫曼编码。其主要思想

及其过程都在下面的程序中体现。

#include

#include

#include

using namespace std;

int mecou; //定义全局变量计码长

class Huffman { //构造Huffman类

public:

int parent; //和的位置

int value; //频率值

int prenum; //该数的初始位置

int left; //和的左加数位置

int right; //和的右加数位置

};

int main( ){

void swap(Huffman &a,Huffman &b);

int Partition(Huffman *a,int p,int r);

void QuickSort(Huffman *a,int p,int r);

void Hsort(Huffman *a,int n,int nl,int nr);

float PHf(Huffman *a,int n,int (*c)[3]);

void CPHf(Huffman *a,Huffman &b,int i);

void Renew(Huffman *a,int n);

float Unchange(int n,Huffman *a);

Huffman p[50]; //定义类数组

int copy[50][3]; //定义copy三维数组便于查询

int num,n; //编码长num,最后数组长为n

float cnum,ucnum;

//定义定长码所需码数总和,哈弗曼编码所需码数的总和char f1,f2; //用于输入[,]两个符号

printf"输入字符数量:"; //输入所需参数

cin>>num;

n=2*num-1;

cout<<"输入"<

cin>>f1;

for(int i=1;i<=num;i++){ //对类的各项赋值

cin>>p[i].value;

p[i].parent=0;

p[i].prenum=i;

p[i].left=0;

p[i].right=0;

}

cin>>f2;

cout<<"字符数量:"<

cout<<"字符编号:";

for(int i=1;i<=num;i++)

cout<

cout<

cout<<"字符频率:";

for(int i=1;i<=num;i++)

cout<

cout<

ucnum=Unchange(num); //得到定码长所需的码数总和Hsort(p,n,1,num);

//根据频率值排序并循环添加和,再排序得到最终的序列Renew(p,n);

//把最终序列里的和结点与加数结点对应便于向后找和结点cnum=PHf(p,n,copy);

//输出哈弗曼编码后各编号的前缀码,得到哈弗曼编码所需总码数cout<<"压缩率为"<

system("pause");

}

void Renew(Huffman *a,int n){

//找到该值的左右加数将其的位置写入加数的和

for(int i=3;i<=n;i++){ //对排完序的数组进行搜索

if(a[i].left!=0&&a[a[i].left].parent==0)

//找到没有完成对应的和结点和它的加数结点

{

a[a[i].left].parent=i; //在其左加数结点的和位置写入其现在的位置

a[a[i].right].parent=i; //在其右加数结点的和位置写入其现在的位置}

}

}

void swap(Huffman &a,Huffman &b){//交换a,b的类值

int l;

l=a.value;

a.value=

b.value;

b.value=l;

l=a.prenum;

a.prenum=

b.prenum;

b.prenum=l;

l=a.left;

a.left=

b.left;

b.left=l;

l=a.right;

a.right=

b.right;

b.right=l;

}

int Partition(Huffman *a,int p,int r){

//根据类值中的频率值由小到大排序

int i=p;

int j=r+1;

int x=a[p].value;

while(true) {

while (a[++i].value

while (a[--j].value>x);

if (i>=j) break;

swap(a[i],a[j]);

}

swap(a[p],a[j]);

return j;

}

void QuickSort(Huffman *a,int p,int r){

//根据类值中的频率值由小到大排序

if (p

int q=Partition(a,p,r);

QuickSort(a,p,q-1);

QuickSort(a,q+1,r);

}

}

void Hsort(Huffman *a,int n,int nl,int nr)

{ //根据类值中的频率值由小到大排序,取最小的两个数相加,

//和放在数组最后,移动指针继续排序

if(nr

QuickSort(a,nl,nr);

a[++nr].value=a[nl].value+a[nl+1].value;

a[nr].left=nl;

a[nr].right=nl+1;

a[nr].parent=0;

a[nr].prenum=nr;

nl=nl+2;

Hsort(a,n,nl,nr);}

}

void CPHf(Huffman *a,Huffman &b,int i)

{ //输出字符的前缀码,得到码数的长度值

if(b.parent!=0) //当该数的和位置上的数不为0时

{

CPHf(a,a[b.parent],b.parent); //找到它的和继续递归

mecou++; //编号i的前缀码长度加1

cout<<(i+1)%2; //输出编号i前缀码中的一个码1或0

}

}

float PHf(Huffman *a,int n,int (*c)[3])

{

int ave=0;

int w=(n+1)/2; //得到编码数,w=num

for(int i=1;i<=n-1;i++)

{

if(a[i].prenum<=(n+1)/2)

//通过类值的最初位置搜索需要编码的数,排除他们的和

{

c[a[i].prenum][0]=i;

//将编码值按其最初位置存放在三维数组C中,第一维放它在a的编号

c[a[i].prenum][1]=a[i].value; //第二维存放其频率

}

}

//c[1:w][0],c[1:w][[1]里存放1---w编号在a中的编号值和频率值

for(int i=1;i<=w;i++){

int e=c[i][0]; //e等于第i个编码在a上的位置c[i][0]

mecou=0; //清空mecou的值

cout<<"第"<

CPHf(a,a[e],e); //调用CPHf输出字符的前缀码

c[i][2]=mecou; //第i个字符前缀码的长度mecou,存放在c[i][2]里ave+=mecou*c[i][1]; //编号的前缀码长乘以频率的总和cout<

}

float pp=(float)ave; //转换类型

cout<<"使用变长码编码需要"<

return pp; //返回总码数

}

float Unchange(int n,Huffman *a){ //得到定长编码的总码数

float all=0;

for(int i=1;i<=n;i++)

all+=a[i].value; //计算频率和all

float l=((int)(log((float)n)/log(2.0))+1)*all;

//利用方程式计算定长码所需编码位数

cout<<"使用定长码编码需要"<

return l; //返回定长码所需码数的总个数

}

☆对各类排序算法的总结

1、快速排序(QuickSort)

快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。

(1)如果不多于1个数据,直接返回。

(2)一般选择序列最左边的值作为支点数据。

(3)将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。

(4)对两边利用递归排序数列。

快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写

出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。

2 归并排序(MergeSort)

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。

3 堆排序(HeapSort)

堆排序适合于数据量非常大的场合(百万数据)。

堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

4 Shell排序(ShellSort)

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth 的分组方法。

Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。

5 插入排序(InsertSort)

插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的

结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。

6 冒泡排序(BubbleSort)

冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。它是O(n^2)的算法。

7 交换排序(ExchangeSort)和选择排序(SelectSort)

这两种排序方法都是交换方法的排序算法,效率都是 O(n2)。在实际应用中处于和冒泡排序基本相同的地位。它们只是排序算法发展的初级阶段,在实际中使用较少。

8 基数排序(RadixSort)

基数排序和通常的排序算法并不走同样的路线。它是一种比较新颖的算法,但是它只能用于整数的排序,如果我们要把同样的办法运用到浮点数上,我们必须了解浮点数的存储格式,并通过特殊的方式将浮点数映射到整数上,然后再映射回去,这是非常麻烦的事情,因此,它的使用同样也不多。而且,最重要的是,这样算法也需要较多的存储空间。

9 总结

排序法平均时间最差情形稳定度额外空间备注

冒泡 O(n2) O(n2) 稳定O(1) n小时较好

交换 O(n2) O(n2) 不稳定O(1) n小时较好

选择 O(n2) O(n2) 不稳定O(1) n小时较好

插入 O(n2) O(n2) 稳定O(1) 大部分已排序时较好

基数O(logrd) O(logrd) 稳定O(n) d是关键字项数(0-9),

r是基数(个十百)

Shell O(nlogn) O(n s) 1

快速O(nlogn) O(n2) 不稳定O(nlogn) n大时较好

归并O(nlogn) O(nlogn) 稳定O(1) n大时较好

堆O(nlogn) O(nlogn) 不稳定O(1) n大时较好

☆学习心得

无论我们学习什么课程,概念永远是基础,所有的知识都是建立在基础概念之上的。我们要将概念熟记于心,然后构建知识框架。数据结构包括线性结构、树形结构、图状结构或网状结构。线性结构包括线性表、栈、队列、串、数组、广义表等,栈和队列是操作受限的线性表,串的数据对象约束为字符集,数组和广义表是对线性表的扩展:表中的数据元素本身也是一个数据结构。除了线性表以外,栈是重点,因为栈和递归紧密相连,递归是程序设计中很重要的一种工具。树状结构中的重点自然是二叉树和哈弗曼树了。对于二叉树的很多操作都是基于对二叉树的遍历,掌握了如何遍历,很多问题也就迎刃而解了,比如对二叉树结点的查找访问、统计二叉树中叶子结点的数目、求二叉树的深度等。哈弗曼编码也有着很广泛的应用。对于图状结构,主要学习图的存储结构及图的遍历。对算法的学习是学习数据结构的关键。要注重对算法的掌握。对于一个算法,如果我们不是很理解的话,可以手动将算法走一遍,慢慢理解该算法的思想。学习这门课程的最终目的,还是要学会如何设计算法,这需要我们长期的练习和思考。

不得不说,在学习这门课的过程中,我还是暴露了一些问题的,数据结构是一门既重视理论,又重视实践的课程,而在我的学习中,理论占了绝大多数的时间,反而没有什么时间来研究具体的代码的实现,我觉得这一点是非常不好的,在更多时候,我过分注重基础知识的掌握,反而忘记了实践是检验真理的唯一标准,我想,在下学期对算法的学习过程中,我会注意这一点,将理论和实践紧密地结合在一起。

数据结构学习总结

数据结构学习总结 经过一学期的学习,我对数据结构有了我自己的认识。一开始,我以为它和C语言和C++一样,都是讲一门语言。但学习之后,发现事实并不是这样,在数据结构的学习中,有线性表,有队,有栈,有树,有图等等。这些看起来没有关系,其实之间有着千丝万缕的联系。线性表是其中最简单的,所以在前几章学习,后面依次逐章变难,学起来也很吃力。 《数据结构与算法》以基本数据结构和算法设计策略为知识单元,系统地介绍了数据结构的知识与应用、计算机算法的设计与分析方法,主要内容包括线性表、树、图和广义表、算法设计策略以及查找与排序算法等。 线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。线性表具有如下的结构特点:均匀性:虽然不同数据表的数据元素可以是各种各样的,但对于同一线性表的各数据元素必定具有相同的数据类型和长度。有序性:各数据元素在线性表中的位置只取决于它们的序号,数据元素之前的相对位置是线性的,即存在唯一的“第一个“和“最后一个”的数据元素,除了第一个和最后一个外,其它元素前面均只有一个数据元素直接前驱和后面均只有一个数据元素(直接后继)。在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法。链式存储结构将在本网站线性链表中介绍,本章主要介绍用数组实现线性表数据元素的顺序存储及其应用。另外栈、队列和串也是线性表的特殊情况,又称为受限的线性结构。 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生

钢结构认识实习报告

钢结构认识实习报告 钢结构主要由型钢和钢板等制成的钢梁、钢柱、钢桁架等构件组成,各构件或部件之间通常采用焊缝、螺栓或铆钉连接。本文为大家了,仅供参考! 转眼间,暑假就过去,通过这一个多月的实习,我学到了不少知识,通过这篇实习报告,总结一下我对着2个月的实习认识,我在施工的各个方面表达一下我对建筑的认识。首先我认为施工的安全是最重要的。随着我国建设小康社会的不断深入,城镇化建设的速度与规模与日惧增,无论是城市还是乡村,建筑工地鳞次栉比,一幢幢高楼拔地而起,一座座老城旧貌换新颜,人们对现代建筑的美观、舒适及其多功能的追求是不断在升级,施工技术正随着建筑物的高度而迅速提升。而同时,随之带来了很多新问题的出现,这当中最重要的要属施工的安全。安全问题贯穿于工程建设的始终,从施工到投入使用,安全无时无刻不牵挂着建设者和使用者的心。 施工技术的发展代表着我国建筑业发展的水平。“经济合理,技术先进”的发展方向才是一个国家建筑业是否发达的代表。提高施工技术是有许多先决的条件,如经济实力、施工人员的素质、施工机械的水平、施工现场管理的能力等诸多因素。在某理工大学体育馆工程,遇见过这样的事例。该地区没有能起吊设计中钢梁的起重机械,不得以从外地租用了两辆大型起重机械才把钢梁安装完毕,进行施工的企业也是南方的某著名钢结构公司,这样无行中增大了施工成本和竣工的时间。影响建筑安全的因素是错综复杂的,除工程建设本身众

多因素的相互干扰与影响,工程的技术问题,材料的品质问题,工程的经济问题等等都从不同层面制约着建筑物的安全。工程安全不仅仅是工程技术问题,更是一个社会经济问题,它与人们的生活息息相关,涉及社会经济的发展和人类社会的进步。因此,在进行建筑工程设计和施工的每个环节,在追求工程经济效益及社会效益的同时,千万记住:安全是工程建设永恒的主题!在建设施工安全方面,国家及地方主管部门抓得格外严格。除进行经济处罚外,出现人身伤亡事故的施工项目部、建设单位、监理单位等所有相关人员都要受到行政处罚,有关单位还会遭受降低企业资格等级的处罚。可还是有不可预料的“灾害”发生,如吊车工操作不当身亡;某工地在进行吊运过程中,吊物下落把一名正在操作搅拌机的施工人员头部打裂,当场死亡。这些触目惊心的事例再次说明:“施工安全重于泰山”。 其次施工质量与管理是相辅相程的关系,两者相互制约,相互促进。必须有严格的管理,质量才能有保障,反过来,有好的质量必须有一整套严格的管理制度与之相照应。《建筑工程质量验收规范》GB50300—20xx在建筑工程质量上做出了细致的规定,每个施工单位都以它做为施工质量评判的标准。下面就施工中常见的质量事故做简要分析,阐述施工质量与管理的关系。 一.底层模板支架沉降 1.原因分析:在施工过程中,管理不善,支模前不进行设计,立模后不仔细检查支架是否稳固,施工班组操作技工没有进行培训,不熟悉施工方法,盲目蛮干,导致发生工程事故。

数据结构课程设计报告模板

《数据结构I》三级项目报告 大连东软信息学院 电子工程系 ××××年××月

三级项目报告注意事项 1. 按照项目要求书写项目报告,条理清晰,数据准确; 2. 项目报告严禁抄袭,如发现抄袭的情况,则抄袭者与被抄袭者均 以0分计; 3. 课程结束后报告上交教师,并进行考核与存档。 三级项目报告格式规范 1. 正文:宋体,小四号,首行缩进2字符,1.5倍行距,段前段后 各0行; 2. 图表:居中,图名用五号字,中文用宋体,英文用“Times New Roman”,位于图表下方,须全文统一。

目录 一项目设计方案 (3) 二项目设计分析 (4) 三项目设计成果 (4) 四项目创新创业 (5) 五项目展望 (6) 附录一:项目成员 (6) 附录二:相关代码、电路图等 (6)

一项目设计方案 1、项目名称: 垃圾回收 2、项目要求及系统基本功能: 1)利用数据结构的知识独立完成一个应用系统设计 2)程序正常运行,能够实现基本的数据增加、删除、修改、查询等功能3)体现程序实现算法复杂度优化 4)体现程序的健壮性 二项目设计分析 1、系统预期实现基本功能: (结合本系统预期具体实现,描述出对应基本要求(增、删、改、查等)的具体功能) 1. 2. 3. 4. 5. 6. 7. 2、项目模块功能描述 (基本分为组织实施组织、程序功能模块编写、系统说明撰写等。其中程序功能子模块实现) 模块一: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块二: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块n: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

大学数据结构期末知识点重点总结(考试专用)

.. ;.. 第一章 概论 1.数据结构描述的是按照一定逻辑关系组织起来的待处理数据元素的表示及相关操作,涉及数据的逻辑结构、存储结构和运算 2.数据的逻辑结构是从具体问题抽象出来的数学模型,反映了事物的组成结构及事物之间的逻辑关系 可以用一组数据(结点集合K )以及这些数据之间的 一组二元关系(关系集合R )来表示:(K, R) 结点集K 是由有限个结点组成的集合,每一个结点代表一个数据或一组有明确结构的数据 关系集R 是定义在集合K 上的一组关系,其中每个关系r (r ∈R )都是K ×K 上的二元关系 3.数据类型 a.基本数据类型 整数类型(integer)、实数类型(real)、布尔类型(boolean)、字符类型(char )、指针类型(pointer ) b.复合数据类型 复合类型是由基本数据类型组合而成的数据类型;复合数据类型本身,又可参与定义结构更为复杂的结点类型 4.数据结构的分类:线性结构(一对一)、树型结构(一对多)、图结构(多对多) 5.四种基本存储映射方法:顺序、链接、索引、散列 6.算法的特性:通用性、有效性、确定性、有穷性 7.算法分析:目的是从解决同一个问题的不同算法中选择比较适合的一种,或者对原始算法进行改造、加工、使其优化 8.渐进算法分析 a .大Ο分析法:上限,表明最坏情况 b .Ω分析法:下限,表明最好情况 c .Θ分析法:当上限和下限相同时,表明平均情况 第二章 线性表 1.线性结构的基本特征 a.集合中必存在唯一的一个“第一元素” b.集合中必存在唯一的一个“最后元素” c.除最后元素之外,均有唯一的后继 d.除第一元素之外,均有唯一的前驱 2.线性结构的基本特点:均匀性、有序性 3.顺序表 a.主要特性:元素的类型相同;元素顺序地存储在连续存储空间中,每一个元素唯一的索引值;使用常数作为向量长度 b. 线性表中任意元素的存储位置:Loc(ki) = Loc(k0) + i * L (设每个元素需占用L 个存储单元) c. 线性表的优缺点: 优点:逻辑结构与存储结构一致;属于随机存取方式,即查找每个元素所花时间基本一样 缺点:空间难以扩充 d.检索:ASL=【Ο(1)】 e .插入:插入前检查是否满了,插入时插入处后的表需要复制【Ο(n )】 f.删除:删除前检查是否是空的,删除时直接覆盖就行了【Ο(n )】 4.链表 4.1单链表 a.特点:逻辑顺序与物理顺序有可能不一致;属于顺序存取的存储结构,即存取每个数据元素所花费的时间不相等 b.带头结点的怎么判定空表:head 和tail 指向单链表的头结点 c.链表的插入(q->next=p->next; p->next=q;)【Ο(n )】 d.链表的删除(q=p->next; p->next = q->next; delete q;)【Ο(n )】 e.不足:next 仅指向后继,不能有效找到前驱 4.2双链表 a.增加前驱指针,弥补单链表的不足 b.带头结点的怎么判定空表:head 和tail 指向单链表的头结点 c.插入:(q->next = p->next; q->prev = p; p->next = q; q->next->prev = q;) d.删除:(p->prev->next = p->next; p->next->prev = p->prev; p->prev = p->next = NULL; delete p;) 4.3顺序表和链表的比较 4.3.1主要优点 a.顺序表的主要优点 没用使用指针,不用花费附加开销;线性表元素的读访问非常简洁便利 b.链表的主要优点 无需事先了解线性表的长度;允许线性表的长度有很大变化;能够适应经常插入删除内部元素的情况 4.3.2应用场合的选择 a.不宜使用顺序表的场合 经常插入删除时,不宜使用顺序表;线性表的最大长度也是一个重要因素 b.不宜使用链表的场合 当不经常插入删除时,不应选择链表;当指针的存储开销与整个结点内容所占空间相 比其比例较大时,应该慎重选择 第三章 栈与队列 1.栈 a.栈是一种限定仅在一端进行插入和删除操作的线性表;其特点后进先出;插入:入栈(压栈);删除:出栈(退栈);插入、删除一端被称为栈顶(浮动),另一端称为栈底(固定);实现分为顺序栈和链式栈两种 b.应用: 1)数制转换 while (N) { N%8入栈; N=N/8;} while (栈非空){ 出栈; 输出;} 2)括号匹配检验 不匹配情况:各类括号数量不同;嵌套关系不正确 算法: 逐一处理表达式中的每个字符ch : ch=非括号:不做任何处理 ch=左括号:入栈 ch=右括号:if (栈空) return false else { 出栈,检查匹配情况, if (不匹配) return false } 如果结束后,栈非空,返回false 3)表达式求值 3.1中缀表达式: 计算规则:先括号内,再括号外;同层按照优先级,即先乘*、除/,后加+、减-;相同优先级依据结合律,左结合律即为先左后右 3.2后缀表达式: <表达式> ::= <项><项> + | <项> <项>-|<项> <项> ::= <因子><因子> * |<因子><因子>/|<因子> <因子> ::= <常数> ? <常数> ::= <数字>|<数字><常数> <数字> ∷= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 3.3中缀表达式转换为后缀表达式 InfixExp 为中缀表达式,PostfixExp 为后缀表达式 初始化操作数栈OP ,运算符栈OPND ;OPND.push('#'); 读取InfixExp 表达式的一项 操作数:直接输出到PostfixExp 中; 操作符: 当‘(’:入OPND; 当‘)’:OPND 此时若空,则出错;OPND 若非空,栈中元 素依次弹出,输入PostfixExpz 中,直到遇到‘(’为止;若 为‘(’,弹出即可 当‘四则运算符’:循环(当栈非空且栈顶不是‘(’&& 当前运算符优先级>栈顶运算符优先级),反复弹出栈顶运 算符并输入到PostfixExp 中,再将当前运算符压入栈 3.4后缀表达式求值 初始化操作数栈OP ; while (表达式没有处理完) { item = 读取表达式一项; 操作数:入栈OP ; 运算符:退出两个操作数, 计算,并将结果入栈} c.递归使用的场合:定义是递归的;数据结构是递归的;解决问题的方法是递归的 2.队列 a.若线性表的插入操作在一端进行,删除操作在另一端进行,则称此线性表为队列 b.循环队列判断队满对空: 队空:front==rear ;队满:(rear+1)%n==front 第五章 二叉树 1.概念 a. 一个结点的子树的个数称为度数 b.二叉树的高度定义为二叉树中层数最大的叶结点的层数加1 c.二叉树的深度定义为二叉树中层数最大的叶结点的层数 d.如果一棵二叉树的任何结点,或者是树叶,或者恰有两棵非空子树,则此二叉树称作满二叉树 e.如果一颗二叉树最多只有最下面的两层结点度数可以小于2;最下面一层的结点都集中在该层最左边的位置上,则称此二叉树为完全二叉树 f.当二叉树里出现空的子树时,就增加新的、特殊的结点——空树叶组成扩充二叉树,扩充二叉树是满二叉树 外部路径长度E :从扩充的二叉树的根到每个外部结点(新增的空树叶)的路径长度之和 内部路径长度I :扩充的二叉树中从根到每个内部结点(原来二叉树结点)的路径长度之和 2.性质 a. 二叉树的第i 层(根为第0层,i ≥0)最多有2^i 个结点 b. 深度为k 的二叉树至多有2k+1-1个结点 c. 任何一颗二叉树,度为0的结点比度为2的结点多一个。n0 = n2 + 1 d. 满二叉树定理:非空满二叉树树叶数等于其分支结点数加1 e. 满二叉树定理推论:一个非空二叉树的空子树(指针)数目等于其结点数加1 f. 有n 个结点(n>0)的完全二叉树的高度为?log2(n+1)?,深度为?log2(n+1)?? g. 对于具有n 个结点的完全二叉树,结点按层次由左到右编号,则有: 1) 如果i = 0为根结点;如果i>0,其父结点编号是 (i-1)/2 2) 当2i+1∈N ,则称k 是k'的父结 点,k'是的子结点 若有序对∈N , 则称k'k ″互为兄弟 若有一条由 k 到达ks 的路径,则 称k 是的祖先,ks 是k 的子孙 2.树/森林与二叉树的相互转换 a.树转换成二叉树 加线: 在树中所有兄弟结点之间加一连线 抹线: 对每个结点,除了其最左孩子外,与其余孩 子之间的连线 旋转: 45° b.二叉树转化成树 加线:若p 结点是双亲结点的左孩子,则将的右孩子,右孩子的右孩子,所有右孩子,都与p 的双亲用线连起来 线 调整:将结点按层次排列,形成树结构 c.森林转换成二叉树 将各棵树分别转换成二叉树 将每棵树的根结点用线相连 为轴心,顺时针旋转,构成二叉树型结构 d.二叉树转换成森林 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到 的所有右孩子间连线全部抹掉,使之变成孤立的二叉树 还原:将孤立的二叉树还原成树 3.周游 a.先根(次序)周游 若树不空,则先访问根结点,然后依次先根周游各棵子树 b.后根(次序)周游 若树不空,则先依次后根周游各棵子树,然后访问根结点 c.按层次周游 若树不空,则自上而下自左至右访问树中每个结点 4.存储结构 “左子/右兄”二叉链表表示法:结点左指针指向孩子,右结点指向右兄弟,按树结构存储,无孩子或无右兄弟则置空 5. “UNION/FIND 算法”(等价类) 判断两个结点是否在同一个集合中,查找一个给定结点的根结点的过程称为FIND 归并两个集合,这个归并过程常常被称为UNION “UNION/FIND ”算法用一棵树代表一个集合,如果两个结点在同一棵树中,则认为它们在同一个集合中;树中的每个结点(除根结点以外)有仅且有一个父结点;结点中仅需保存父指针信息,树本身可以 存储为一个以其结点为元素的数组 6.树的顺序存储结构 a. 带右链的先根次序表示法 在带右链的先根次序表示中,结点按先根次序顺序存储在一片连续的存储单元中 每个结点除包括结点本身数据外,还附加两个表示结构的信息字段,结点的形式为: info 是结点的数据;rlink 是右指针,指向结点的下一个兄弟;ltag 是一个左标记,当结点没有子结点(即对应二 叉树中结点没有左子结点时),ltag 为 1,否则为 0 b. 带双标记位的先根次序表示法 规定当结点没有下一个兄弟(即对应的二叉树中结点没有右子结点时)rtag 为1,否则为0 c. 带双标记位的层次次序表示法 结点按层次次序顺序存储在一片连续的存储单元中 第七章 图 1.定义 a.假设图中有n 个顶点,e 条边: 含有e=n(n-1)/2条边的无向图称作完全图 含有e=n(n-1) 条弧的有向图称作有向完全图 若边或弧的个数e < nlogn ,则称作稀疏图,否则称作稠密图 b. 顶点的度(TD)=出度(OD)+入度(ID) 顶点的出度: 以顶点v 为弧尾的弧的数目 顶点的入度: 以顶点v 为弧头的弧的数目 c.连通图、连通分量 若图G 中任意两个顶点之间都有路径相通,则称此图为连通图 若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量 d.强连通图、强连通分量 对于有向图,若任意两个顶点之间都存在一条有向路径,则称此有向图为强连通图 否则,其各个极大强连通子图称作它的强连通分量 e.生成树、生成森林 假设一个连通图有n 个顶点和e 条边,其中n-1条边和n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树 对非连通图,则将由各个连通分量构成的生成树集合称做此非连通图的生成森林 2.存储结构 a.相邻矩阵表示法 表示顶点间相邻关系的矩阵 若G 是一个具有n 个顶点的图,则G 的相邻矩阵是如下定义的n ×n 矩阵: A[i,j]=1,若(Vi, Vj)(或)是图G 的边 A[i,j]=0,若(Vi, Vj)(或)不是图G 的边 b.邻接表表示法 为图中每个顶点建立一个单链表,第i 个单链表中的结点表示依附于顶点Vi 的边(有向图中指以Vi 为尾的弧)(建立单链表时按结点顺序建立) 3.周游 a. 深度优先周游: 从图中某个顶点V0出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发,深度优先搜索遍历图中的其余顶点,直至图中所有与V0有路径相通的顶点都被访问到为止 b. 广度优先周游: 从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,随后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有与V0有路径相通的顶点都被访问到为止,若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止 4.拓扑排序 拓扑排序的方法是:1)选择一个入度为0的顶点且输出之 2)从图中删掉此顶点及所有的出边 3)回到第1步继续执行,直至图空或者图不空但找不到无前驱(入度为0)的顶点为止 5.单源最短路径(Dijkstra 算法) 6.每对顶点间的最短路径(Floyd 算法) 7.最小生成树 a.Prim 算法 b.Kruskal 算法 c.两种算法比较:Prim 算法适合稠密图,Kruskal 算法适合稀疏图 第八章 内排序 算法 最大时间 平均时间 直接插入排序 Θ(n2) Θ(n2) 冒泡排序 Θ(n2) Θ(n2) 直接选择排序 Θ(n2) Θ(n2) Shell 排序 Θ(n3/2) Θ(n3/2) 快速排序 Θ(n2) Θ(nlog n) 归并排序 Θ(nlog n) Θ(nlog n) 堆排序 Θ(nlog n) Θ(nlog n) 桶式排序 Θ(n+m) Θ(n+m) 基数排序 Θ(d ·(n+r)) Θ(d ·(n+r)) 最小时间 S(n) 稳定性 Θ(n) Θ(1) 稳定 Θ(n) Θ(1) 稳定 Θ(n2) Θ(1) 不稳定 Θ(n3/2) Θ(1) 不稳定 Θ(nlog n) Θ(log n) 不稳定 Θ(nlog n) Θ(n) 稳定 Θ(nlog n) Θ(1) 不稳定 Θ(n+m) Θ(n+m) 稳定 Θ(d ·(n+r)) Θ(n+r) 稳定 第十章 检索 1.平均检索长度(ASL )是待检索记录集合中元素规模n 的函数, 其定义为: ASL= Pi 为检索第i 个元素的概率;Ci 为找到第i 个元素所需的比较次数 2.散列 a.除余法 用关键码key 除以M(取散列表长度),并取余数作为散列地址 散列函数为:hash(key) = key mod M b.解决冲突的方法 开散列方法:把发生冲突的关键码存储在散列表主表之外(在主表外拉出单链表) 闭散列方法:把发生冲突的关键码存储在表中另一个位置上 c.线性探查 基本思想:如果记录的基位置存储位置被占用,就在表中下移,直到找到一个空存储位置;依次探查下述地址单元:d0+1,d0+2,...,m-1,0, 1,..., d0-1;用于简单线性探查的探查函数是:p(K, i) = i d.散列表的检索 1.假设给定的值为K ,根据所设定的散列函数h ,计算出散列地址h(K) 2. 如果表中该地址对应的空间未被占用,则检索失败,否则将该地址中的值与K 比较 3. 若相等则检索成功;否则,按建表时设定的处理冲突方法查找探查序列的下一个地址,如此反复下去,直到某个地址空间未被占用(可以插入),或者关键码比较相等(有重复记录,不需插入)为止 e.散列表的删除:删除后在删除地点应加上墓碑(被删除标记) f.散列表的插入:遇到墓碑不停止,知道找到真正的空位置 第十一章 索引技术 1.概念: a.主码:数据库中的每条记录的唯一标识 b.辅码:数据库中可以出现重复值的码 2.B 树 a.定义:B 树定义:一个m 阶B 树满足下列条件: (1) 每个结点至多有m 个子结点; (2) 除根和叶外 其它每个结点至少有??个子结点; (3) 根结点至少有两个子结点 例外(空树,or 独根) (4) 所有的叶在同一层,可以有??- 1到m-1个关键码 (5) 有k 个子结点的非根结点恰好包含k-1个关键码 b.查找 在根结点所包含的关键码K1,…,Kj 中查找给定的关键码值(用顺序检索(key 少)/二分检索(key 多));找到:则检索成功;否则,确定要查的关键码值是在某个Ki 和Ki+1之间,于是取pi 所指结点继续查找;如果pi 指向外部结点,表示检索失败. c.插入 找到的叶是插入位置,若插入后该叶中关键码个数

钢结构课程总结

《钢结构基础》课程总结 钢结构是土木工程专业一门重要的专业课,为加强学生对钢结构基本理论的理解和对钢结构设计规范的应用,老师对我们进行为期1周左右的钢结构课程设计。通过这一实践教学活动,使我们掌握工程设计的思路方法和技术规范;提高我们工程设计计算、理论分析和图纸表达等解决实际工程问题的能力; 由钢板、热轧型钢或冷加工成型的薄壁型钢以及钢索为主材建造的工程结构,如房屋、桥梁等,称为钢结构。钢结构是土木工程的主要结构形式之一。 钢结构与钢筋混凝土结构、砌体结构等都属于按材料划分的工程结构的不同分支。 这学期主要学习了,轴心受力构件—拉杆、压杆受弯构件—梁偏心受力构件—拉弯杆(偏心受拉)压弯杆(偏心受压)材料、连接、基本构件结构设计 掌握钢结构的特点和钢结构的应用范围;理解钢结构按极限状态的设计方法,掌握其设计表达式的应用;初步了解钢结构的主要结构形式;了解钢结构在我国的发展趋势;为进一步深入学习钢结构知识打下基础。 钢结构的材料关系到钢结构的计算理论,同时对钢结构的制造、安装、使用、造价、安全等均有直接联系。本章简要介绍钢材的生产过程和组织构成,重点介绍钢材的主要性能以及各种因素对钢材性能的影响;钢材的种类、规格及选择原则。

1.了解钢结构的两种破坏形式; 2.掌握结构用钢材的主要性能及其机械性能指标; 3.掌握影响钢材性能的主要因素特别是导致钢材变脆的主要因素; 4.掌握钢材疲劳的概念和疲劳计算方法; 5.了解结构用钢材的种类、牌号、规格; 6.理解钢材选择的依据,做到正确选择钢材。 了解钢结构采用的焊缝连接和螺栓连接两种常用的连接方法及其特点;理解对接焊缝及角焊缝的工作性能,掌握各种内力作用下,焊接连接的构造和计算方法;了解焊接应力和焊接变形的种类、产生原因、影响以及减小和消除的方法;理解普通螺栓和高强螺栓的工作性能和破坏形式,掌握螺栓连接在传递各种内力时连接的构造和计算方法,熟悉螺栓排列方式和构造要求。理解受弯构件的工作性能,掌握受弯构件的强度和刚度的计算方法;了解受弯构件整体定和局部稳定的基本概念,理解梁整体稳定的计算原理以及提高整体稳定性的措施;熟悉局部稳定的验算方法及有关规定。 下面谈谈我在学习过程中的一点体会。 一、学习要有明确的目标。在学习这门课之前,我就了解到,《钢结构设计原理》是多么重要的一门课,特别在毕业设计时,你现在不熟悉,以后设计会带来很多麻烦,而我不是那种只满足及格的学生。但想起那计算题,我就气,本身正在学结构力学,而且还学得不错,谁知把一些题给弄糊涂了. 二、学习要有兴趣。在我看来,学那一门课都一样,有兴趣才能

数据结构课程设计报告模板

课程设计说明书 课程名称:数据结构 专业:班级: 姓名:学号: 指导教师:成绩: 完成日期:年月日

任务书 题目:黑白棋系统 设计内容及要求: 1.课程设计任务内容 通过玩家与电脑双方的交替下棋,在一个8行8列的方格中,进行棋子的相互交替翻转。反复循环下棋,最后让双方的棋子填满整个方格。再根据循环遍历方格程序,判断玩家与电脑双方的棋子数。进行大小判断,最红给出胜负的一方。并根据y/n选项,判断是否要进行下一局的游戏。 2.课程设计要求 实现黑白两色棋子的对峙 开发环境:vc++6.0 实现目标: (1)熟悉的运用c语言程序编写代码。 (2)能够理清整个程序的运行过程并绘画流程图 (3)了解如何定义局部变量和整体变量; (4)学会上机调试程序,发现问题,并解决 (5)学习使用C++程序来了解游戏原理。 (6)学习用文档书写程序说明

摘要 本文的研究工作在于利用计算机模拟人脑进行下黑白棋,计算机下棋是人工智能领域中的一个研究热点,多年以来,随着计算机技术和人工智能技术的不断发展,计算机下棋的水平得到了长足的进步 该程序的最终胜负是由棋盘上岗双方的棋子的个数来判断的,多的一方为胜,少的一方为负。所以该程序主要运用的战术有削弱对手行动战术、四角优先战术、在游戏开局和中局时,程序采用削弱对手行动力战术,即尽量减少对手能够落子的位置;在游戏终局时则采用最大贪吃战术,即尽可能多的吃掉对手的棋子;而四角优先战术则是贯穿游戏的始终,棋盘的四角围稳定角,不会被对手吃掉,所以这里是兵家的必争之地,在阻止对手进角的同时,自己却又要努力的进角。 关键词:黑白棋;编程;设计

数据结构期末总结

您现在的位置:希赛教育首页> 自考学院> 数据结构与算法> 正文 数据结构第三章(栈与队列)习题参考答案https://www.doczj.com/doc/977539187.html,作者:自考频道来源:希赛教育2008年1月5日发表评论进入社区 一、基础知识题 3.1 设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题: (1)若入、出栈次序为Push(1), Pop(),Push(2),Push(3), Pop(), Pop( ),Push(4), Pop( ),则出栈的数字序列为何(这里Push(i)表示i进栈,Pop( )表示出栈)? (2) 能否得到出栈序列1423和1432?并说明为什么不能得到或者如何得到。 (3)请分析1,2 ,3 ,4 的24种排列中,哪些序列是可以通过相应的入出栈操作得到的。 3.2 链栈中为何不设置头结点? 答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。 3.3 循环队列的优点是什么? 如何判别它的空和满? 答:循环队列的优点是:它可以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得到充分的利用。判别循环队列的"空"或"满"不能以头尾指针是否相等来确定,一般是通过以下几种方法:一是另设一布尔变量来区别队列的空和满。二是少用一个元素的空间。每次入队前测试入队后头尾指针是否会重合,如果会重合就认为队列已满。三是设置一计数器记录队列中元素总数,不仅可判别空或满,还可以得到队列中元素的个数。

3.4 设长度为n的链队用单循环链表表示,若设头指针,则入队出队操作的时间为何? 若只设尾指针呢? 答:当只设头指针时,出队的时间为1,而入队的时间需要n,因为每次入队均需从头指针开始查找,找到最后一个元素时方可进行入队操作。若只设尾指针,则出入队时间均为1。因为是循环链表,尾指针所指的下一个元素就是头指针所指元素,所以出队时不需要遍历整个队列。 3.5 指出下述程序段的功能是什么? (1) void Demo1(SeqStack *S){ int i; arr[64] ; n=0 ; while ( StackEmpty(S)) arr[n++]=Pop(S); for (i=0, i< n; i++) Push(S, arr[i]); } //Demo1 (2) SeqStack S1, S2, tmp; DataType x; ...//假设栈tmp和S2已做过初始化 while ( ! StackEmpty (&S1)) { x=Pop(&S1) ; Push(&tmp,x);

数据结构学习总结

数据结构与算法课程学习总结 2010年 5月 17日 班级:08计本(2)班姓名:谷敏敏学号:0804012023 时光飞逝,转眼之间,经过十几周的学习,“数据结构与算法”这门课程也已经接近尾声。通过学习、实验,我们明白“数据结构与算法”这门课是我们计算机专业人才培养计划中的一门必修的核心课程,同时也是计算机科学与技术专业同学的一门重要的基础专业课,重要之处不言而喻,所以,对于这门课大家也是比较认真投入的,学的也是比较尽心。当然这还与老师独特的教学风格以及不少的实验训练是密不可分的。 对于本学科的知识内容的概括、总结可如下所示: 1.第一章中是介绍的本学科的的一些基础、相关概念,如数据、数据元素、数据类型 以及数据结构的定义。其中,数据结构包括逻辑结构、存储结构和运算集合。逻辑 结构分为四类:集合型、线性、树形和图形结构,数据元素的存储结构分为:顺序 存储、链接存储、索引存储和散列存储四类。紧接着介绍了一些常用的数据运算。 最后着重介绍算法性能分析,包括算法的时间性能分析以及算法的空间性能分析。 2.第二章具体地介绍了顺序表的概念、基本运算及其应用。基本运算有:初始化表、 求表长、排序、元素的查找、插入及删除等。而关于元素查找方法课本例举了多种 方法,有:简单顺序查找、二分查找和分块查找。排序方法有:直接插入排序、希 尔排序、冒泡排序、快速排序、直接选择排序及归并排序等。最后介绍了顺序串的 概念以及字符处理问题,其重点核心内容在于串的模式匹配。 3.第三章介绍的是链表及其应用,链表中数据元素的存储不一定是连续的,还可以占 用任意的、不连续的物理存储区域。与顺序表相比,链表的插入、删除等功能是不 需要移动元素的,只需变化指针的取向即可,算法简单快捷,。链表这一章中介绍 了链表的节点结构、静态与动态链表的概念、链表的基本运算(如求表长、插入、 查找、删除等)、单链表的建立(头插法和尾插法)以及双向循环链表的定义、结 构、功能和基本算法。 4.第四章和第五章是关于堆栈和队列的介绍与应用。堆栈与队列是两种运算受限制的 线性结构。其基本运算方法与顺序表和链表运算方法基本相同,不同的是堆栈须遵 循“先进后出”的规则,对堆栈的操作只能在栈顶进行;而队列要遵循“先进先 出”的规则,课本中列出了两种结构的相应的基本算法,如入栈、出栈、入队、出 队等。在介绍队列时,提出了循环队列的概念,以避免“假溢出”的现象。同时, 对于其应用也分别讲述了如括号匹配问题等。 5.第六章介绍了特殊矩阵和广义表的概念与应用。其中,特殊矩阵包括对称矩阵、三 角矩阵、对角矩阵和稀疏矩阵等,课本中分别详细介绍了它们的存储结构。稀疏矩 阵的应用包括转置和加法运算等。最后介绍了广义表的相关概念及存储结构,关于 关于广义表的应用有:m元多项式的表示问题。 6.第七章是关于二叉树及其应用。在介绍有关概念时,提到了二叉树的性质以及两种 特殊的二叉树:完全二叉树和满二叉树。接着介绍二叉树的顺序存储和链接存储以 及生成算法。重点介绍二叉树的遍历算法(递归算法、先序、中序和后序遍历非递 归算法)和线索二叉树。二叉树的应用:基本算法、哈弗曼树、二叉排序树和堆与 堆排序。本章为本课程重点内容,需要重点掌握。

钢结构实习报告记录

钢结构实习报告记录

————————————————————————————————作者:————————————————————————————————日期:

钢 结 构 实 习 报 告 地点:杭萧钢构 日期:2015.11.25 姓名:陈洁弛

本学期我们学习了钢结构课程,这是一门很有美感的一门学科,老师为了让我们更好的了解钢结构的知识,让我们能够把书本里学到的钢结构的基本构造和拼接等的概念、原理,理解的更加深刻。特地安排了一次实习,也就就是11月25日带我们土木工程地下的两个班,去了一趟与钢结构有关的工厂,进行参观实习。在要去参观的前一天,洛阳迎来了今年的第一场雪,地面上融化的雪水都结了冰,所以我们坐校车开了大概一个小时,才到达邻近洛阳邙山的‘‘河南杭萧钢构有限公司’’。 河南杭萧钢构有限公司(简称“河南杭萧”),成立于2001年,经过多年的努力,现已发展成为河南省百高企业、高新技术企业、洛阳市优秀民营企业、高成长型企业和洛阳市“小巨人”企业。 河南杭萧钢构有限公司位于洛阳飞机场工业园区,注册资金3200万元,工厂占地面积146亩,一期生产车间建筑面积25000平方米,二期生产车间建筑面积26000平方米。河南杭萧目前拥有国内国外先进的钢结构加工设备,钢结构年加工能力10万吨,拥有职工450人,其中技术人员45人,是集钢结构建筑设计、制造、安装于一体的钢结构企业。 河南杭萧的产品体系主要有:钢结构住宅体系、多(超)高层钢结构体系、厂房钢结构体系、管桁架等大跨度空间结构体系、特殊钢结构体系。 河南杭萧具有钢结构工程专业承包壹级资质、钢结构制造一级资质、轻型钢结构工程设计专项乙级资质,并通过了北京中水卓越认证有限公司GB/T24001-2004环境管理体系认证、GB/T28001-2001职业健康安全认证、GB/T19001-2008质量管理体系认证。河南杭萧与浙江大学、同济大学、河南科技大学、洛阳理工学院、华北水利水电大学多个知名院校建立了长期的密切合作关系,获得了33项国家专利成果,施工建设的多项工程获得了“省优质工程奖”及“国家钢结构金奖”。

数据结构课程设计报告

山东建筑大学 课程设计成果报告 题目: 1.数组实现两个矩阵的相乘运算 2.成绩分析问题 课程:数据结构A课程设计 院(部):管理工程学院 专业:信息管理与信息系统 班级:信管*** 学生姓名:*** 学号:******** 指导教师:******* 完成日期:2016年12月29日

目录 目录 (2) 一、课程设计概述 (3) 二、课程设计题目一 (3) 用数组实现两个矩阵的相乘运算 (3) 2.1[问题描述] (3) 2.2[要求及提示]: (3) 2.3[详细设计] (4) 2.4[调试分析] (5) 2.5[运行结果及分析] (5) 三、课程设计题目二 (6) 成绩分析问题 (6) 3.1[问题描述] (6) 3.2[概要设计] (6) 3.3[存储结构] (7) 3.4[流程图] (7) 3.5[详细设计] (8) 3.6[调试分析] (8) 3.7[运行结果及分析] (22) 四、参考文献: (25)

一、课程设计概述 本次数据结构课程设计共完成两个题:用数组实现两个矩阵相乘运算、成绩分析问题。使用语言:C 编译环境:vc6.0 二、课程设计题目一 用数组实现两个矩阵的相乘运算 2.1[问题描述] #include “stdio.h” int r[6][6]; void mult(int a[6][6] , int b[6][6]){ } main(){ int i,j; int num1[6][6],num2[6][6]; printf(“请输入第一个矩阵的值:”,); for(i=1;i<=6;i++) for(j=1;j<=6;j++) scanf(“%d”,&num1[i][j]); printf(“请输入第二个矩阵的值:”,); for(i=1;i<=6;i++) for(j=1;j<=6;j++) scanf(“%d”,&num2[i][j]); mult(num1,num2); printf(“\n两个矩阵相乘后的结果为:”); for(i=1;i<=6;i++) {for(j=1;j<=6;j++) printf(“%4d”,r[i][j]); printf(“\n”); } } 2.2[要求及提示]: 1、要求完善函数mult( ),

最新数据结构实训总结

精品文档 这次课程设计的心得体会通过实习我的收获如下1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。2、培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。从刚开始得觉得很难,到最后把这个做出来,付出了很多,也得到了很多,以前总以为自己对编程的地方还不行,现在,才发现只要认真做,没有什么不可能。 编程时要认真仔细,出现错误要及时找出并改正,(其中对英语的要求也体现出来了,因为它说明错误的时候都是英语)遇到问题要去查相关的资料。反复的调试程序,最好是多找几个同学来对你的程序进行调试并听其对你的程序的建议,在他们不知道程序怎么写的时候完全以一个用户的身份来用对你的用户界面做一些建议,正所谓当局者迷旁观者清,把各个注意的问题要想到;同时要形成自己的编写程序与调试程序的风格,从每个细节出发,不放过每个知识点,注意与理论的联系和理论与实践的差别。另外,要注意符号的使用,注意对字符处理,特别是对指针的使用很容易出错且调试过程是不会报错的,那么我们要始终注意指针的初始化不管它怎么用以免不必要麻烦。 通过近两周的学习与实践,体验了一下离开课堂的学习,也可以理解为一次实践与理论的很好的连接。特别是本组所做的题目都是课堂上所讲的例子,在实行之的过程中并不是那么容易事让人有一种纸上谈兵的体会,正所谓纸上得来终觉浅绝知此事要躬行。实训过程中让我们对懂得的知识做了进一步深入了解,让我们的理解与记忆更深刻,对不懂的知识与不清楚的东西也做了一定的了解,也形成了一定的个人做事风格。 通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的认识,根据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数组,只要运用得当,也能达到相同的效果,甚至更佳,就如这次的课程设计,通过用for的多重循环,舍弃多余的循环,提高了程序的运行效率。在编写这个程序的过程中,我复习了之前学的基本语法,哈弗曼树最小路径的求取,哈弗曼编码及译码的应用范围,程序结构算法等一系列的问题它使我对数据结构改变了看法。在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,也从中发现自己平时学习的不足和薄弱环节,从而加以弥补。 精品文档

相关主题
文本预览
相关文档 最新文档