数据结构实验指导书.docx
- 文档编号:4419587
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:58
- 大小:31.58KB
数据结构实验指导书.docx
《数据结构实验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书.docx(58页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书
湖北工程学院
——计算机与信息科学学院
《数据结构》
实验指导书
张凯兵
目录
实验一、线性表的顺序存储及其操作1
实验二、线性表的链式存储及其操作6
实验三、栈的顺序存储及其实现12
实验四、栈的链式存储及其实现15
实验五、队列的顺序存储及其实现19
实验六、队列的链式存储及其实现22
实验七、串的定长顺序存储结构及其实现26
实验八、树和二叉树的操作30
实验九、图的存储与实现36
实验十、各种查找操作39
实验十一、各种排序操作41
实验十二、数据结构课程设计(任选1题)43
实验一、线性表的顺序存储及其操作
一、实验目的
(1)掌握线性表的特点
(2)掌握线性表顺序存储结构基本运算。
(3)掌握顺序表的创建、插入、删除和显示线性表中元素等基本操作。
二、实验内容
1.创建顺序存储结构的线性表
2.线性表在顺序存储结构上的插入元素,删除元素运算
三、实验要求
1.C++/C完成算法设计和程序设计并上机调试通过。
2.撰写实验报告,提供实验结果和数据。
3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。
四、程序实现
写出每个操作的算法(操作过程)[参考源代码]
#include
#include
#include
#defineMAXSIZE20//定义线性表最大容量
typedefstruct
{
intdata[MAXSIZE];//线性表中数组元素
intlast;
}SeqList;
/*************************************************************************
*
*函数名称:
*Init_SeqList()
*参数:
*无
*返回值:
指向线性表的指针
*说明:
*该函数用于创建顺序储存结构的空线性表
*
***************************************************************************/
SeqList*Init_SeqList()
{
SeqList*L;
L=newSeqList;
if(L!
=NULL)
{
L->last=-1;
returnL;
}
else
{
returnNULL;
}
}
/*************************************************************************
*
*函数名称:
*Insert_SeqList()
*参数:
*SeqList*L:
指向线性表的指针;
inti:
插入位置;
intx:
插入新元素数据
*返回值:
插入成功:
true
插入失败:
false
*说明:
*该函数用于在顺序储存结构的线性表插入一个新元素
*
***************************************************************************
boolInsert_SeqList(SeqList*L,inti,intx)
{
intj;
if(L->last==MAXSIZE-1)//表已经满
{
cout<<"Thelistisfull!
"< returnfalse; } if(i<1||i>L->last+2)//插入位置不合法 { cout<<"Thepositioninsertedisinvaild! "; returnfalse; } for(j=L->last;j>=i-1;j--)//从最后一个元素开始到第i个元素全部后移1个位置 { L->data[j+1]=L->data[j]; } L->data[i-1]=x;//在第i个位置插入新元素 L->last++;//表长加1 returntrue; } /************************************************************************* * *函数名称: *Create_SeqList() *参数: *SeqList*L: 指向线性表的指针; stringfileName;存放数据元素的文本文件名 *返回值: 成功: true 失败: false *说明: *该函数调用插入函数从一个文本文件中读入数据元素创建一个顺序表 * ***************************************************************************/ boolCreate_SeqList(SeqList*L,char*filename) { FILE*fin; intdata; inti=0; boolret=true; boolfinished=false; if((fin=fopen(filename,"r"))==NULL) { return(NULL); } while(! finished) { fscanf(fin,"%d",&data); if(data! =-1) { i++; ret=Insert_SeqList(L,i,data); } else { finished=true; } } returnret; } /************************************************************************* * *函数名称: *Delete_SeqList() *参数: *SeqList*L: 指向线性表的指针; inti;线性表中元素位置 *返回值: 成功: true 失败: false *说明: *该函数从顺序表中删除第i个位置上的元素 * ***************************************************************************/ boolDelete_SeqList(SeqList*L,inti) { intj=0; boolret; if(L->last==-1) { cout<<"Thelistisempty! "< returnfalse; } if(i<1||i>L->last+1)//删除位置不合法 { cout<<"Thepositiondeletedisinvaild! "< ret=false; } else { for(j=i;j<=L->last;j++) { L->data[j-1]=L->data[j]; } L->last--; ret=true; } returnret; } voidOutPutList(SeqList*L) { inti; for(i=0;i<=L->last;i++) { cout< } cout< } voidmain() { SeqList*L; L=Init_SeqList(); if(L! =NULL) { Create_SeqList(L,"in.txt"); OutPutList(L); Delete_SeqList(L,2); OutPutList(L); Insert_SeqList(L,5,100); OutPutList(L); } } 五、程序运行情况 在源程序所在文件夹下创建一个名称为in.txt的文本文件,输入数据如下: 12345678-1作为线性表中的数据元素,其中-1表示输入数据元素的结束。 六、实验总结 (1) (2) (3) 实验二、线性表的链式存储及其操作 七、实验目的 (1)掌握线性表的特点 (2)掌握线性表链式存储结构基本运算。 (3)掌握链式表的创建、插入、删除和显示线性表中元素等基本操作。 八、实验内容 1.创建链式存储结构的线性表 2.线性表在链式存储结构上的插入元素,删除元素运算 九、实验要求 4.C++/C完成算法设计和程序设计并上机调试通过。 5.撰写实验报告,提供实验结果和数据。 6.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。 一十、程序实现 写出每个操作的算法(操作过程)[参考源代码] 一十一、程序运行情况 #include #include #include //定义单链表结点类型 typedefstructlinkNode { intdata; structlinkNode*next; }Node,*LinkList; /************************************************************************* * *函数名称: *outputLinkList() *参数: *LinkListL: 指向单链表的头指针; *返回值: 无 *说明: *该函数输出单链表中所有的结点信息 * ***************************************************************************/ voidoutputLinkList(LinkListL) { Node*p; p=L;//指向单链表中第一个结点 printf("当前链表中的元素值分别为: \n"); while(p! =NULL)//当结点存在时 { printf("%2d\t",p->data); p=p->next;//指向p后继结点 } } /************************************************************************* * *函数名称: *Length() *参数: *LinkListL: 指向单链表的头指针; *返回值: 单链表中结点的个数 *说明: *该函数输出单链表结点的个数 * ***************************************************************************/ intLength(LinkListL) { Node*p; intlength=0; p=L;//指向单链表中第一个结点 while(p! =NULL)//当结点存在时 { length++; p=p->next;//指向p后继结点 } returnlength; } /************************************************************************* * *函数名称: *CreateList() *参数: *无; *返回值: 指向单链表的头指针 *说明: *该函数从键盘上顺序输入若干个整数,以-1结束,从表尾建立一个不带头结点的单链表(只有头指针) * ***************************************************************************/ LinkListCreateList() { Node*p,*s,*head; head=NULL; p=head; intfinished=0; intx; inti=0; printf("---输入若干个整数,以回车键结束! 如输入-1则结束整个输入! ---\n"); while(finished! =1)//当建立未结束 { printf("输入第%d新元素: ",++i); scanf("%d",&x); if(x! =-1)//判断输入是否结束 { s=newNode; s->data=x; if(head==NULL)//对空表单独处理 { head=s; } else//对非空表单独处理 { p->next=s; } s->next=NULL; p=s;//指向最后一个结点 } else { finished=1; } } returnhead;//返回头指针 } /************************************************************************* * *函数名称: *Node*SearchLinkList(LinkListL,inti) *参数: *LinkListL: 指向链表的头指针 *inti: 第i个结点的编号 *返回值: 指向第i个结点的指针 *说明: *该函数从单链表L中查找第i个结点,并返回指向该结点的指针 * ***************************************************************************/ Node*SearchLinkList(LinkListL,inti) { Node*p; intj=1; p=L;//p指向第一个结点 while(p! =NULL&&j { p=p->next;//指向下一个结点 j++; } returnp; } /************************************************************************* * *函数名称: *Node*InsertLinkList(LinkListL,inti,intx) *参数: *LinkListL: 指向链表的头指针 *inti: 第i个结点的编号 *返回值: 失败: 0 成功: 1 *说明: *该函数从单链表L中查找第i个结点,并返回指向该结点的指针 * ***************************************************************************/ intInsertLinkList(LinkListL,inti,intx) { LinkListp,s; p=SearchLinkList(L,i-1); if(p==NULL)//第i个结点存在,p指向的是第i个结点的前驱结点的指针 { return0; } else//新建结点并执行两步插入 { s=newNode; s->data=x; s->next=p->next; p->next=s; return1; } } /************************************************************************* * *函数名称: *intDeleteLinkList(LinkListL,inti) *参数: *LinkListL: 指向链表的头指针 *inti: 第i个结点的编号 *返回值: 第i-1个结点不存在: -1 第i个结点不存在: 0 成功: 1 *说明: *该函数从单链表L中查找第i个结点,并返回指向该结点的指针 * ***************************************************************************/ intDeleteLinkList(LinkListL,inti) { LinkListp,s; p=SearchLinkList(L,i-1);//查找第i-1个结点 if(p==NULL)//第i-1个结点存在,p指向的是第i个结点的前驱结点的指针 { return-1; } else { if(p->next==NULL)//第i个结点不存在 { return0; } else//删除第i个结点 { s=p->next;//指向第i个结点 p->next=s->next; deletes; s=NULL; return1; } } } voidmain() { LinkListHead; Head=CreateList();//创建带头指针的单链表 outputLinkList(Head);//输出单链表详细信息 printf("\n单链表的长度%d\n",Length(Head)); if(InsertLinkList(Head,4,400))//在单链表中插入一个元素 { printf("\n插入成功...! \n"); outputLinkList(Head);//输出单链表详细信息 } else { printf("\n插入失败...! \n"); } if(DeleteLinkList(Head,4)==1)//在单链表中删除一个元素 { printf("\n删除成功...! \n"); outputLinkList(Head);//输出单链表详细信息 } else { printf("\n删除失败...! \n"); } } 一十二、实验总结 (1) (2) (3) 实验三、栈的顺序存储及其实现 一、实验目的 1、掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构,以便在实际问题背景下灵活应用。 二、实验内容 1.顺序栈的存储实现 2.顺序栈的基本运算 三、实验要求 1.用C++/C完成算法设计和程序设计并上机调试通过。 2.撰写实验报告,提供实验结果和数据。 3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。 四、程序实现 写出每个操作的算法(操作过程) 程序运行情况 五、写出输入数据及运行结果 (1)源程序清单 #include #include #defineMAXLEN10 typedefstruct { intdata[MAXLEN]; inttop; }SeqStack; /*初始化空栈*/ SeqStack*InitSeqStack() { SeqStack*s; s=newSeqStack;//分配栈空间 s->top=-1;//置空栈 returns; } /* 将元素x入栈到栈s */ intPush(SeqStack*s,intx) { if(s->top==MAXLEN-1)//栈满 { return0; } else//入栈操作 { s->top++; s->data[s->top]=x; return1; } } /*判断栈是否为空*/ intStackEmpty(SeqStack*s) { if(s->top==-1)//栈为空 { return1; } else { return0; } } /*出栈,将栈顶元素放入x所指向的存储单元中*/ intPop(SeqStack*s,int*x) { if(StackEmpty(s))//栈空 { return0; } else//出栈 { *x=s->data[s->top]; s->top--; } } voidmain() { SeqStack*s; s=InitSeqStack(); intfinished=0; intchoice; inty,x; intz; while(! finished) { printf("请选择操作类型: 1: 入栈\t2: 出栈\t3: 结束\n"); scanf("%d",&x); switch(x) { case1: printf("请输入入栈元素的值: "); scanf("%d",&y); if(Push(s,y)) { printf("入栈成功\n"); } break; case2: if(Pop(s,&z)) { printf("出栈: %d",z); } else { printf("出栈失败! \n"); } break; case-1: finished=1; } } } (2)运行结果 六、实验总结 (1) (2) (3) 实验四、栈的链式存储及其实现 一、实验目的 1、掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的链式存储结构,以便在实际问题背景下灵活应用。 二、实验内容 1.链式栈的存储实现 2.链式栈的基本运算 三、实验要求 1.用C++/C完成算法设计和程序设计并上机调试通过。 2.撰写实验报告,提供实验结果和数据。 3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。 四、程序实现 写出每个操作的算法(操作过程) 程序运行情况 五、写出输入数据及运行结果 (1)源程序清单 #include #include typedefstructstacknode
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书