数据结构实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据结构实验报告总”。
数据结构实验报告
指导教师 姓
名班
级学
号实
验 室
黄梅根
钟志伟 0140703 07310325 S331-B
2008-11-29
单链表的插入和删除实验日志
指导教师:黄梅根
实验时间:2008年10月14日 学院 通信学院 专业信息工程
班级0140703 学号07310325姓名 钟志伟 实验室S331-B
实验题目:
单链表的插入和删除 实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。实验要求:
建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。实验主要步骤:分析、理解程序。调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。3 修改程序:
增加插入结点的功能。
将建立链表的方法改为头插入法。
实验结果:
心得体会:
通过本次实验,我了基本上掌握了线性表的逻辑结构和链式存储结构,从中也发现自己在这方面的知识掌握的还不是很扎实,下来要多看书,将基本的知识要掌握牢固。
二叉树操作实验日志
指导教师:黄梅根
实验时间:2008年 10 月28 日 学院 通信学院 专业信息工程
班级0140703 学号07310325姓名 钟志伟 实验室S331-B 实验题目: 二叉树操作
实验目的:
掌握二叉树的定义、性质及存储方式,各种遍历算法。
实验要求:
采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。
实验主要步骤;1.分析、理解程序。
2.添加中序和后序遍历算法.3.调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。
实验结果:
心得体会:
通过此次实验,我基本掌握了建立二叉树,并且掌握了先序、中序和后序以及按层次遍历的操作,更好的掌握了书本上的知识。
图的遍历操作实验日志
指导教师:黄梅根
实验时间:2008年 11 月 11 日 学院 通信学院 专业 信息工程
班级 0140703 学号 07310325姓名 钟志伟实验室S331-B 实验题目:
图的遍历操作 实验目的:
掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。实验要求:
采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。实验主要步骤:
1、分析、理解程序。
2、调试程序。设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。
实验结果:
心得体会:
通过本次实验,我掌握了有向图和无向图的一些概念,了解了DFS和BFS对图的遍历操作。
循环链表实验日志
指导教师:黄梅根
实验时间:2008年 11 月 25 日 学院 通信学院 专业 信息工程
班级 0140703 学号 07310325 姓名 钟志伟 实验室S331-B 实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握循环链表的基本算法及相关的时间性能分析。
实验要求:
1.实现循环链表的建立
2.输出循环链表节点的指针序列,要求先输出自身的指针,再输出其指向的 节点的指针。如一个有五个节点的循环链表,各节点地址依次为3109,3290,3106,3595,3390,则输出应为:
3109
3290
3290 3106
3106 3595
3595 3390
3390
3109 3.对链表进行由大到小的排序,输出排序完成后的链表和链表的指针序列。
源代码:
#include“stdio.h” #include“string.h” #include“stdlib.h” #include“ctype.h” typedef struct node
//定义结点
{ char data[10];
//结点的数据域为字符串
struct node *next;
//结点的指针域
}ListNode;typedef ListNode * LinkList;
// 自定义LinkList单链表类型 LinkList CreatListR1();
//函数,用尾插入法建立带头结点的单链表 ListNode *LocateNode();
//函数,按值查找结点 void DeleteList();
//函数,删除指定值的结点 void printlist();
//函数,打印链表中的所有值
void DeleteAll();
//函数,删除所有结点,释放内存
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL========== ListNode *LocateNode(LinkList head, char *key){
ListNode *p=head->next;//从开始结点比较
while(p&&strcmp(p->data,key)!=0)//直到p为NULL或p-> data为key止
p=p->next;
//扫描下一个结点
return p;
//若p=NULL则查找失败,否则p指向找到的值为key的结点 }
//==========用尾插入法建立带头结点的单链表=========== LinkList CreatListR1(void){
char ch[10];
LinkList head=(LinkList)malloc(sizeof(ListNode));//生成头结点
ListNode *s,*r,*pp;
r=head;
r->next=head;
printf(“Input # to end ”);//输入“#”代表输入结束
printf(“Please input Node_data:”);
scanf(“%s”,ch);
//输入各结点的字符串
while(strcmp(ch,“#”)!=0){
// pp=LocateNode(head,ch);
//按值查找结点,返回结点指针
// if(pp==NULL)
{
//没有重复的字符串,插入到链表中
s=(ListNode *)malloc(sizeof(ListNode));
strcpy(s->data,ch);
r->next=s;
r=s;
r->next=head;
}
printf(“Input # to end ”);
printf(“Please input Node_data:”);
scanf(“%s”,ch);
}
return head;
//返回头指针 } //==========删除带头结点的单链表中的指定结点======= void DeleteList(LinkList head,char *key){
ListNode *p,*r,*q=head;
p=LocateNode(head,key);
//按key值查找结点的 if(p==NULL){
//若没有找到结点,退出
printf(“position error”);
exit(0);
}
while(q->next!=p)
//p为要删除的结点,q为p的前结点
q=q->next;
r=q->next;
q->next=r->next;
free(r);
//释放结点 } //===========打印链表======= void printlist(LinkList head){
ListNode *p=head->next;
//从开始结点打印
while(p!=head){ printf(“%s,%sn ”,p->data,p->next);
p=p->next;
}
printf(“n”);} //==========删除所有结点,释放空间=========== void DeleteAll(LinkList head){
ListNode *p=head,*r;
while(p->next){ r=p->next;
free(p);p=r;
}
free(p);}
//==========主函数============== void main(){
char ch[10],num[10];
LinkList head;
head=CreatListR1();
//用尾插入法建立单链表,返回头指针
printlist(head);
//遍历链表输出其值
printf(“ Delete node(y/n):”);//输入“y”或“n”去选择是否删除结点
scanf(“%s”,num);
if(strcmp(num,“y”)==0 || strcmp(num,“Y”)==0){
printf(“Please input Delete_data:”);
scanf(“%s”,ch);
//输入要删除的字符串
DeleteList(head,ch);
printlist(head);
}
DeleteAll(head);
//删除所有结点,释放内存 }
实验结果:
心得体会:
通过本次实验,我了解了线性表的逻辑结构和链式结构,从中也发现自己在一些知识上掌握的不是很牢固,自己下来要多看书。