数据结构实验报告一.docx
- 文档编号:11491567
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:16
- 大小:121.68KB
数据结构实验报告一.docx
《数据结构实验报告一.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告一.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构实验报告一
班级学号姓名实验组别
实验日期2010/12/20室温报告日期2010/12/20成绩
报告内容:
(目的和要求,原理,步骤,数据,计算,小结等)
实验名称:
实验一线性表的表示及实现
一、实验目的:
1.掌握线性表的概念。
2.掌握线性表的顺序及链式存储结构定义。
3.熟练运用C语言实现顺序表的基本操作及单链表的基本操作。
4.在掌握顺序表基本操作的基础上,能够用顺序表解决简单问题。
二、实验内容:
5.定义一个顺序表,并输入10个整数,作为顺序表中的元素。
然后编写一个函数PrintList输出表中的所有元素。
6.用算法2-2统计顺序表中的元素数。
7.输入一个位置值和一个元素值,用算法2-4将新元素插入指定的位置,然后输出顺序表中的所有元素,检查插入是否正确。
8.输入一个位置值,用算法2-5将该位置的元素删除,然后用PrintList输出表中的所有元素。
三、实验学时:
2学时
四、实验涉及知识点:
1.线性表可用顺序、链式存储结构表示,线性表的抽象数据类型表示了线性表中的数据元素,元素间的逻辑关系及对线性表的操作集合;
2.顺序表的特点是用数据元素在计算机内物理位置相邻来表示线性表中数据元素之间的逻辑关系;
3.对顺序表的基本操作包括初始化、求元素个数、判断表是否为空、插入元素、删除元素、查找元素位置和遍历等;
4.链式存储结构不要求逻辑上相邻的数据元素在物理位置上也相邻,链表又包括带头结点和不带头结点的链表;
5.对单链表的基本操作包括判断表是否为空、初始化、求元素个数、插入元素、删除元素、销毁单链表等。
五、程序流程分析:
本实验为线性表的基本操作,用到的思想比较简单,流程主要为顺序结构,顺序表和单链表的操作流程图都大致如下:
图1.顺序表操作流程图
根据题目要求,对链表的操作比顺序表仅仅只多了一项“清除所有结点”,这就要每删除一个节点都输出该结点值。
所以对链表的操作流程图知识在图1所示的顺序表操作流程图的基础上增添以下流程
图2.与顺序表操作相比,链表操作附加的流程图
六、实验源程序:
对顺序表和单链表的基本操作可以直接应用书中所给算法,包括初始化、求表长、删除元素、输出表中所有元素;单链表还包括销毁表,这些基本操作及数据类型可以先编写入一个头文件中,如下所示:
对顺序表操作的头文件“shunxubiao.h”为:
#include
#definelistsize100
typedefintdatatype;
typedefstruct
{
datatypeitems[listsize];
intlength;
}sqlist;
intinitlist(sqlist*l)
{
l->length=0;
return1;
}
intlistlength(sqlistl)
{
returnl.length;
}
intlistinsert(sqlist*l,intpos,datatypeitem)
{
inti;
if(l->length>=listsize)
{
printf("表已满,无法插入!
");
return0;
}
if(pos<=0||pos>l->length+1)
{
printf("插入位置不合法!
");
return0;
}
for(i=l->length-1;i>=pos-1;i--)
l->items[i+1]=l->items[i];
l->items[pos-1]=item;
l->length++;
return1;
}
intlistdelete(sqlist*l,intpos,datatype*item)
{
inti;
if(pos<1||pos>l->length)
{
printf("删除位置不合法!
");
return0;
}
*item=l->items[pos-1];
for(i=pos;i
l->items[i-1]=l->items[i];
l->length--;
return1;
}
intprintlist(sqlistl)
{
inti;
for(i=0;i printf("%d",l.items[i]); printf("\n"); return1; } 然后再在对顺序表进行操作的主程序中先包含头文件“shunxubiao.h”该主程序为: #include #include"shunxubiao.h" #defineN10 intmain() { inti,item_in,pos_in,item_del,pos_del;//item_in,pos_in用于输入插入的元素和位置,item_del用于返回删除元素,pos_del用于输入删除的元素 inta[N]; sqlistsxlist; initlist(&sxlist);//初始化线性表 printf("请输入%d个数字: \n",N);//用户键入数据 for(i=0;i scanf("%d",&a[i]); for(i=0;i { if(! listinsert(&sxlist,i+1,a[i])) { printf("\n运行错误! \n"); return0; } } printf("该线性表如下: \n"); printlist(sxlist);//将数据输出 printf("\n"); printf("该顺序表中的元素数为: \n%d个\n",listlength(sxlist));//统计顺序表中D的元素数 printf("\n请输入要插入的元素和位置: \n"); scanf("%d%d",&item_in,&pos_in); if(! listinsert(&sxlist,pos_in,item_in)) { printf("\n插入操作错误! \n"); return0; } printf("\n插入元素后的线性表如下: \n"); printlist(sxlist); printf("\n请输入要删除的元素的位置: \n"); scanf("%d",&pos_del); if(! listdelete(&sxlist,pos_del,&item_del)) { printf("\n删除操作时运行错误! \n"); return0; } printf("\n删除的元素为: \n%d\n",item_del); printf("\n删除操作后的线性表如下: \n"); printlist(sxlist); } 单链表除了所包含的头文件中和主程序中变量名与顺序表的程序中的变量名不同外,其他都大致相同,只不过单链表所包含的头文件中多了一个基本操作: 即销毁单链表的同时输出所删除的元素。 程序如下: voiddestroylist(linklisth) { inti=1; pnodep=h; h=h->next; free(p); while(h) { printf("第%d次删除的元素为: %d\n",i++,h->data); p=h; h=h->next; free(p); } } 这样在主程序的最后多加一句destroylist(h)调用语句,就可以完成对单链表的销毁操作。 单链表主程序所包含的头文件“xianxinglianbiao.h”如下: #include typedefintdatatype; typedefstructnode { datatypedata; structnode*next; }lnode,*pnode,*linklist; intinitlist(linklist*h) { *h=(linklist)malloc(sizeof(lnode)); if(! h) { printf("初始化链表错误! \n"); return0; } (*h)->next=NULL; return1; } intlistlength(linklisth) { inttotal=0; pnodep=h->next; while(p) { total++; p=p->next; } returntotal; } intlistinsert(linklisth,intpos_in,datatypeitem_in) { pnodep=h,q; inti=0; while(p&&i { p=p->next; i++; } if(! p||i>pos_in-1) { printf("插入位置不合法! \n"); return0; } q=(pnode)malloc(sizeof(lnode)); if(! q) { printf("不能生成新结点\n"); return0; } q->data=item_in; q->next=p->next; p->next=q; return1; } intlistdelete(linklisth,intpos_del,datatype*item_del) { pnodep=h,q; inti=0; while(p->next&&i { p=p->next; i++; } if(! p->next||i>pos_del-1) { printf("删除位置不合法! \n"); return0; } q=p->next; p->next=q->next; *item_del=q->data; free(q); return1; } voiddestroylist(linklisth) { inti=1; pnodep=h; h=h->next; free(p); while(h) { printf("第%d次删除的元素为: %d\n",i++,h->data); p=h; h=h->next; free(p); } } voidprintlist(linklisth) { pnodep=h->next; while(p) { printf("%d",p->data); p=p->next; } printf("\n"); } 单链表的主程序如下: #include #include"xianxinglianbiao.h" #defineN6 intmain() { inti,item_in,pos_in,item_del,pos_del;//item_in,pos_in用于输入插入的元素和位置,item_del用于返回删除的元素,pos_del用于输入删除的位置 inta[N]; linklisth=NULL; initlist(&h); printf("请输入%d个数字: \n",N);//用户键入数据 for(i=0;i scanf("%d",&a[i]); for(i=0;i { if(! listinsert(h,i+1,a[i])) { printf("插入操作错误\n"); return0; } } printf("此链表的所有元素如下: \n"); printlist(h); printf("\n请输入要删除的元素的位置: \n"); scanf("%d",&pos_del); if(! listdelete(h,pos_del,&item_del)) { printf("\n删除操作时运行错误! \n"); return0; } printf("\n删除的元素为: \n%d\n",item_del); printf("\n删除操作后的链表如下: \n"); printlist(h); printf("\n请输入要插入的元素和位置: \n"); scanf("%d%d",&item_in,&pos_in); if(! listinsert(h,pos_in,item_in)) { printf("\n插入操作错误! \n"); return0; } printf("\n插入元素后的线性表如下: \n"); printlist(h); printf("\n"); destroylist(h); } 七、实验步骤 顺序表程序的实验步骤: 1.进行VisualStudio开发环境; 2.创建项目: 文件—新建—项目—WIN32项目—输入项目名称test1; 3.创建头文件和源文件,将预先编制好的程序输入; 4.保存文件; 5.选择调试—开始调试。 对于单链表程序实验步骤,与上述步骤相同,只是项目名称为test2,头文件和源文件的名称和上述顺序表的不同,输入的程序不同而已。 具体的调试过程,顺序表和单链表也是一样的,只需要根据程序调用时提示的语句操作,就可以完成对程序的测试,即先随意输入指定个数的数据,等待程序提示输入要插入的元素值和位置时再次输入,再次等到程序提示输入要删除元素的位置时,再次输入,最后就可以查看整个过程的运行结果,结果如下: 顺序表的程序的运行结果为: 图1.顺序表的程序运行结果 单链表的程序运行结果如下: 图2.单链表的程序运行结果 八、实验小结 本题实验是第一次数据结构实验,让我感觉到了数据结构所讲内容的特点,以及应用数据结构相关方法进行编程的优势,以前学完C语言以后进行编程,虽然也能完成功能,但是每一次编程都要做很多重复性的工作,即使每次编程所用的数据的结构相同,而这次实验用了一些书上的基本算法,这些算法的特点就是通用性很强,它们包括了对常用的数据类型的基本操作,需要用到这些操作的时候只需要对这些函数进行调用即可,大大减小了编程的工作量,可以将这些基本操作或函数编写如头文件中,以后再对这一类数据用到类似的操作时,一样可以直接调用,会节省很大的时间和精力,可以大大提高编程的效率。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告