数据结构综合实验报告.docx
《数据结构综合实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构综合实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构综合实验报告
《数据结构与算法》
综合实验报告
系别:
信息与控制学院
专业:
软件工程专业
学号:
10306110
姓名:
魏兴
指导教师:
李莹
2011年11月25日
沈阳理工大学应用技术学院
实验目的
掌握线性表的建立、插入、删除算法;
掌握查找算法;
掌握排序算法;
实验要求
使用C语言(环境任意)开发程序,能够对用户输入的任意一组数据,建立一个线性表,可以输出此线性表。
并且能够对此线性表进行插入、删除、查找、排序等操作。
程序流程
1.打开VC++程序
2.编码线形表的语句,让其能够执行建表,输出,删除,查找,插入,排序.显示主函数,显示选择操作主页面.
3执行输入12345来选择想要执行的语句,重复操作,得到所想要的结果.
代码及运行结果(主要语句要求有注释)
#defineNULL0宏定义用NULL代替0
typedefstructlinknode定义结构体名节点类型
{
intdata;将数据成员定义为INT型
structlinknode*next;定义数据结构名和指针变量名(指针域)
}node;
node*creat(head)单链表,参数为head形参)
node*head;声明指针head指向节点
{
node*currnode,*newnode;声明指针currnode环绕newnode指向节点
intx;定义整形变量
head=(node*)malloc(sizeof(node));向系统申请分配链表节点的存储空间首地址为head
currnode=head;赋值给currnodehead
do{
scanf("%d",&x);输入变量X
newnode=(node*)malloc(sizeof(node));向系统申请动态的存储空间首地址为newnode
newnode->data=x;newnode指向第一个节点并赋予x
currnode->next=newnode;currnode指向第一个节点并赋值为newnode
currnode=newnode;指针向后移到下一个节点
}while(x!
=NULL);若X不为空时循环为0时导出循环
head=head->next;头指针向下个节点后移head由head指向next赋给
currnode->next=NULL;最后一点的指针域为空
returnhead;返回head
};
node*head;声明头节点head
voidprint()转出函数
{
node*currnode;声明
currnode=head;当前指针为head
printf("链表如下....linklist:
");输出linllist单链表
while(currnode->data!
=NULL)循环并同时判断指针currnode指向的data值为是否为空
{
printf("%d-->",currnode->data);若不为空则输出指针的指
currnode=currnode->next;指针currnode向下一节点后移
};
printf("NULL\n");输出空换行
printf("链表长度为........linklistlength%d\n",length());输出单链表的长度length返回至
};
voiddelete()删除函数
{
intx;定义整形变量X
node*delnode,*currnode;声明delnode和currnode指针
printf("输入要删除数据.......inputdeletedata:
");输出inputdeletedate(输入想删除数据)
scanf("%d",&x);输入整形X
if(head->data==NULL)printf("此链表为空无法删除......thislinklistempty!
\n");判断若头指针为空输出LINKLISTnull
if(head->data==x)判断如果头指针指向的data与X值相同
{
delnode=head;指针delnode指向头指针
head=head->next;头指针后移
free(delnode);释放指针delnode
if(head==NULL)printf("此链表为空........thislinklistenpty!
");若head为null输出linklistnull
}
else
{
currnode=head;否则指针currude指向head
delnode=currnode->next;指针delnode指向指针currnode并向下一节点后移
while(delnode->data!
=x&&delnode!
=NULL)判断delnode指向data不等于X且不为空
{
currnode=currnode->next;则指针currnode向下一节点移动
delnode=currnode->next;指针delnode指向currnode并向后移
};
if(delnode==NULL)如果指针delnide为空
printf("无此数据.......nothisdata!
\n");则直接输出adataisnull
else
{
currnode->next=delnode->next;否则指针currnodenext指向指针delenode到next
free(delnode);释放delnode所指的变量空间
};
};
};
intlength()定义长度
{
node*currnode;声明指针currnode
inti=0;定义整形i=0
currnode=head;指针currnode指向head
while(currnode->data!
=NULL)判断指针currnode若不为空
{
currnode=currnode->next;指针currnode后移
i++;i++
};
returni;返回i值
};
单链表的删除流程图:
若删除的节点为头结点,则
若删除的节点为中间节点,则
voidfind()查找
{
node*currnode;申明指针currnode
intcount=1,x;定义整形变量count=1和x
currnode=head;指针currnode指向head
printf("inputsearchdata:
");输出inputsearchdata
scanf("%d",&x);输入整形x
while(currnode->data!
=NULL&&currnode->data!
=x)循环判断指针不为空且不等于x值
{
currnode=currnode->next;则指针currnode后移
count++;count++
};
if(currnode->data!
=NULL)如果currnode指向的data不为空
{
printf("\n%dNo.",currnode->data);输出指针currnode所指向的值
printf("%ddata。
\n",count);输出,换行
}
else
printf("\nthisdataisnull!
\n");否则输出thisdataisnull
};
voidinsert()插入
{
intx,w,i;定义整形变量x,w,i
node*insertnode,*afternode,*currnode;申明指针insertnode,afternode,currnode;
printf("inputinsertdata:
");输出inputinsertdata
scanf("%d",&x);输入x
printf("insertnnodeafter\n=");输出insertnnodeafter,换行
scanf("%d",&w);输入w
insertnode=(node*)malloc(sizeof(node));向系统中申请动态存储空间
insertnode->data=x;将指针insertnode指向的data值赋为x
if(w==0)若w=0
{
insertnode->next=head;指针insertnode→node指向head
head=insertnode;指针head指向指针insertnode
}
else
if(w>length()){printf("oucurrnodetwider!
\n");}若w超过总长度,输出outwider
else
{
currnode=head;afternode=currnode->next;指针currnode指向指针head
for(i=1;i{
afternode=afternode->next;指针afternode向下一结点后移
currnode=currnode->next;指针currnode向下一结点后移
};
currnode->next=insertnode;指针currnode->next指向指针insertnode
insertnode->next=afternode;指针insertnode->next指向指针afternode
};
};
单链表的插入流程图:
若插入到头结点以前,则
若插入到中间节点,则
若插入尾节点,则
voidsort()//排序部分(冒泡排序)
{
node*p,*p2,*p3;//声明指针p,p2,p3
inti,j,n;//定义整形i,j,n
inttemp;//定义整形temp
n=length(head);//n赋值为头结点的长度
if(head==NULL||head->next==NULL)//如果只有一个或者没有节点
returnhead;//返回头结点
p=head;//指针p指向head头节点
for(j=1;j{
p=head;//指针p指向head头节点
for(i=0;i{
if(p->data>p->next->data)//判断p指向的值和p的下一个节点指向的值
{
temp=p->data;//如果判断成立则temp的值为p的值
p->data=p->next->data;//p的值为p下一个节点的值
p->next->data=temp;//p的下一个节点的值为temp的值
}
p=p->next;//指针p向下一节点移动
}
}
return(head);//返回head
};
voidoperation()定义operation函数
{
printf("deletedata:
...1\n");删除数据按1
printf("serchdata:
...2\n");寻找数据按2
printf("insertdata:
...3\n");插入数据按3
printf("sort:
..........4\n");排序数据按4
printf("end:
...........5\n");结束按5
printf("?
:
");
};
main()main函数
{
intchoic;定义int型变量choic
printf("\ninputdata0end:
\n");输出显示”inputdata0end:
”
head=creat();
print();
operation();
do{
scanf("%d",&choic);运用switch语句实现选择功能
switch(choic)
{
case1:
delete();
print();
operation();
break;
case2:
find();
operation();
break;
case3:
insert();
print();
operation();
break;
case4:
sort(&head);
print();
operation();
break;
default:
printf("operenteend!
");
break;};
}while(choic!
=5);}
个人总结(要求1000字以上)
一、《数据结构与算法》知识点
在自己寻找的教材的《数据结构与算法》第一章便交代了该学科的相关概念,如数据、数据元素、数据类型以及数据结构的定义。
其中,数据结构包括逻辑结构、存储结构和运算集合。
逻辑结构分为四类:
集合型、线性、树形和图形结构,数据元素的存储结构分为:
顺序存储、链接存储、索引存储和散列存储四类。
紧接着介绍了一些常用的数据运算。
最后着重介绍算法性能分析,包括算法的时间性能分析以及算法的空间性能分析。
第二章具体地介绍了顺序表的概念、基本运算及其应用。
基本运算有:
初始化表、求表长、排序、元素的查找、插入及删除等。
元素查找方法有:
简单顺序查找、二分查找和分块查找。
排序方法有:
直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序及归并排序等。
最后介绍了顺序串的概念,重点在于串的模式匹配。
链表中数据元素的存储不一定是连续的,还可以占用任意的、不连续的物理存储区域。
与顺序表相比,链表的插入、删除不需要移动元素,给算法的效率带来较大的提高。
链表这一章中介绍了链表的节点结构、静态与动态链表的概念、链表的基本运算(如求表长、插入、查找、删除等)、单链表的建立(头插法和尾插法)以及双向循环链表的定义、结构、功能和基本算法。
堆栈与队列是两种运算受限制的线性结构。
其基本运算方法与顺序表和链表运算方法基本相同,不同的是堆栈须遵循“先进后出”的规则,对堆栈的操作只能在栈顶进行;而队列要遵循“先进先出”的规则,教材中列出了两种结构的相应算法,如入栈、出栈、入队、出队等。
在介绍队列时,提出了循环队列的概念,以避免“假溢出”的现象。
第六章介绍了特殊矩阵和广义表的概念与应用。
其中,特殊矩阵包括对称矩阵、三角矩阵、对角矩阵和稀疏矩阵,书中分别详细介绍了它们的存储结构。
稀疏矩阵的应用包括转置和加法运算等。
最后介绍了广义表的相关概念及存储结构,关于它的应用,课本中举了m元多项式的表示问题。
第七章二叉树的知识是重点内容。
在介绍有关概念时,提到了二叉树的性质以及两种特殊的二叉树:
完全二叉树和满二叉树。
接着介绍二叉树的顺序存储和链接存储以及生成算法。
重点介绍二叉树的遍历算法(递归算法、先序、中序和后序遍历非递归算法)和线索二叉树。
二叉树的应用:
基本算法、哈弗曼树、二叉排序树和堆排序。
树与二叉树是不同的概念。
教材介绍了树和森林的概念、遍历和存储结构,还有树、森林和二叉树的相互关系,树或森林怎样转化成二叉树,二叉树又如何转换为树和森林等算法。
散列结构是一种查找效率很高的一种数据结构。
本章的主要知识点有:
散列结构的概念及其存储结构、散列函数、两种冲突处理方法、线性探测散列和链地址散列的基本算法以及散列结构的查找性能分析。
最后一章介绍了图的概念及其应用,是本书的难点。
图的存储结构的知识点有:
邻接矩阵、邻接表、逆邻接表、十字链表和邻接多重表。
图的遍历包括图的深度优先搜索遍历和广度优先搜索遍历。
其余知识点有:
有向图、连通图、生成树和森林、最短路径问题和有向无环图及其应用。
有向无环图重点理解AOV网和拓扑排序及其算法。
二、对各知识点的掌握情况
总体来看,对教材中的知识点理解较为完善,但各个章节均出现有个别知识点较为陌生的现象。
现将各个章节出现的知识点理解情况列举如下。
第一章中我对数据和数据结构的概念理解较为透彻,熟悉数据结构的逻辑结构和存储结构。
而对算法的时间、空间性能分析较为模糊,尤其是空间性能分析需要加强。
第二章,顺序表的概念、生成算法理解较为清晰,并且熟悉简单顺序查找和二分查找,对分块查找较为含糊;排序问题中,由于冒泡排序在大一C语言课上已经学习过,再来学习感觉很轻松。
对插入排序和选择排序理解良好,但是,在实际运用中仍然出现明显不熟练的现象。
由于在归并排序学习中感觉较吃力,现在对这种排序方法仍然非常模糊,所以需要花较多的时间来补习。
此外串的模式匹配也是较难理解的一个地方。
链表这一章中,除对双向循环链表这一知识点理解困难之外,其他的知识点像单链表的建立和基本算法等都较为熟悉。
接下来的有关堆栈以及队列的知识点比较少,除有关算法较为特殊以外,其余算法都是先前学过的顺序表和链表的知识,加上思想上较为重视,因此这部分内容是我对全书掌握最好的一部分。
不足之处仍然表现在算法的性能分析上。
在学习第六章时感觉较为吃力的部分在于矩阵的应用上,尤其对矩阵转置算法的C语言描述不太理解。
稀疏矩阵相加算法中,用三元组表实现比较容易理解,对十字链表进行矩阵相加的方法较为陌生。
第七章是全书的重点,却也有一些内容没有完全理解。
在第一节基本概念中,二叉树的性质容易懂却很难记忆。
对二叉树的存储结构和遍历算法这部分内容掌握较好,能够熟练运用,而对于二叉树应用中的哈弗曼树却比较陌生。
第八章内容较少,牵涉到所学的队列的有关内容,总体来说理解上没有什么困难,问题依旧出现在算法的性能分析上。
散列结构这一章理解比较完善的知识点有:
基本概念和存储结构。
散列函数中直接定址法和除留余数法学得比较扎实,对数字分析法等方法则感觉较为陌生。
对两种冲突处理的算法思想的理解良好,问题在于用C语言描述上。
最后一章,图及其应用中,图的定义、基本运算如图的生成等起初理解有困难,但随着学习深入,对它的概念也逐步明朗起来。
邻接矩阵、邻接表和逆邻接表掌握较好,而对十字链表和邻接多重表则较为陌生。
感觉理解较为吃力的内容还有图的遍历(包括深度和广度优先遍历),最小生成树问题也是比较陌生的知识点。
最短路径和AOV网学习起来感觉比较轻松,而对于C语言描述却又不大明白。
三、学习体会
接触数据结构与算法以前,我对数据结构与算法并不了解,这是否是在介绍一种新的计算机语言?
如果不是,那么学习这门课程的用途是什么?
为什么各种介绍数据结构的资料采用了不同的计算机语言,如C、C++还有Java?
对于我的C语言学习否有影响……
在学习伊始,自己就明确了它不是一种计算机语言,不会介绍新的关键词,而是通过学习可以设计出良好的算法,高效地组织数据。
一个程序无论采用何种语言,其基本算法思想不会改变。
联系到在大一学期学习的C语言,我深刻认识到了这一点。
“软件开发好比写作文,计算机语言提供了许多华丽的辞藻,而数据结构则考虑如何将这些辞藻组织成一篇优秀的文章来。
”在学习这门课中,要熟悉对算法思想的一些描述手段,包括文字描述、图形描述和计算机语言描述等。
因此,计算机语言基础是必须的,因为它提供了一种重要的算法思想描述手段——机器可识别的描述。
《数据结构与算法》学习结束之后,我总结了学习中遇到的一些问题,最为突出的,书本上的知识比较容易理解,但是当自己采用刚学的知识点编写程序时却感到十分棘手,有时表现在想不到适合题意的算法,有时表现在算法想出来后,只能将书本上原有的程序段誊写到自己的程序中再加以必要的连接以完成程序的编写。
针对这一情况,我会严格要求自己,熟练掌握算法思想,尽量独立完成程序的编写与修改工作,只有这样,才能够提高运用知识,解决问题的能力。
四、对《数据结构与算法》学习的建议
1、建议在学习过程中加大练习的分量,以便能及时消化自己学习的知识,也便于及时了解自己对知识点的掌握情况,同时有助于保持自己良好的精神状态。
2、建议在时间允许的情况下,增加练习的时间,通过练习,加深对知识点的掌握,同时对各知识点的运用有一个更为直观和具体的认识。
以上便是我对《数据结构与算法》的学习总结,我会抓紧时间将没有吃透的知识点补齐。
今后我仍然会继续学习,克服学习中遇到的难关,在打牢基础的前提下向更深入的层面迈进!