《数据结构》实验指导书贵州大学电子信息学院通信工程目录实验一顺序表的操作 (3)实验二链表操作 (8)实验三集合、稀疏矩阵和广义表 (19)实验四栈和队列 (42)实验五二叉树操作、图形或网状结构 (55)实验六查找、排序 (88)贵州大学实验报告 (109)实验一顺序表的操作实验学时:2学时实验类型:验证实验要求:必修一、实验目的和要求1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。
2、以线性表的各种操作(建立、插入、删除等)的实现为重点。
3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现。
二、实验内容及步骤要求1、定义顺序表类型,输入一组整型数据,建立顺序表。
typedef int ElemType; //定义顺序表struct List{ElemType *list;int Size;int MaxSize;};2、实现该线性表的删除。
3、实现该线性表的插入。
4、实现线性表中数据的显示。
5、实现线性表数据的定位和查找。
6、编写一个主函数,调试上述算法。
7、完成实验报告。
三、实验原理、方法和手段1、根据实验内容编程,上机调试、得出正确的运行程序。
2、编译运行程序,观察运行情况和输出结果。
四、实验条件运行Visual c++的微机一台五、实验结果与分析对程序进行调试,并将运行结果进行截图、对所得到的的结果分析。
六、实验总结记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等,并将其写入实验报告中。
【附录----源程序】#include<stdio.h>#include<iostream>using namespace std;typedef int ElemType;struct List{ElemType *list;int Size;int MaxSize;};//初始化线性表bool InitList(List &L){L.MaxSize=20;L.list=new ElemType[L.MaxSize];for(int i=0;i<20&&L.list==NULL;i++){L.list=new ElemType[L.MaxSize];}if(L.list==NULL){cout<<"无法分配内存空间,退出程序"<<endl;return false;}L.Size=0;return true;}//向线性表中插入元素bool InsertList(List &L,int pos,ElemType item){if(pos>L.Size+1||pos<1){cout<<"位置无效"<<endl;return false;}else if(L.Size==L.MaxSize){int k=sizeof(ElemType);L.list=(ElemType*)realloc(L.list,2*L.MaxSize*k);if(L.list==NULL){cout<<"动态分配内存失败,退出运行"<<endl;return false;}L.MaxSize=2*L.MaxSize;}for(int i=L.Size-1;i>=pos-1;i--){L.list[i+1]=L.list[i];}L.list[pos-1]=item;L.Size++;return true;}//删除线性表中的元素bool DeleteList(List &L,ElemType &item,int pos){if(L.Size==0){cout<<"线性表中没有元素,无法删除"<<endl;return false;}if(pos<1||pos>L.Size){cout<<"位置无效"<<endl;return false;}item=L.list[pos-1];for(int i=pos;i<L.Size;i++)L.list[i-1]=L.list[i];L.Size--;if(float(L.Size)/L.MaxSize<0.4&&L.Size>10){int k=sizeof(ElemType);L.list=(ElemType*)realloc(L.list,L.MaxSize*k/2);L.MaxSize=L.MaxSize/2;}return true;}//输出线性表bool Print(List &L){if(L.Size==0){cout<<"线性表中无元素"<<endl;return false;}cout<<"线性表为:"<<endl;for(int i=0;i<L.Size;i++){cout<<L.list[i]<<" ";}cout<<"线性表长度为"<<L.Size<<endl;return true;}//查找数据bool GetList(List L,ElemType item,int pos){if(pos<1||pos>L.Size){cout<<"位置无效"<<endl;return false;}int k;cout<<"按位置查找选择1,按元素查找选择0"<<endl;cin>>k;if(k==1){cout<<"第"<<pos<<"个元素为"<<L.list[pos-1]<<endl;return true;}else if(k==0){for(int i=0;i<L.Size;i++){if(L.list[i]==item)cout<<"你要找的元素为"<<":"<<item<<"在第"<<i+1<<"个"<<endl;if(i==L.Size){cout<<"没有你要找的元素"<<endl;return false;}}}else{cout<<"查找无效,请选择0或1"<<endl;return false;}}void main(){List m;InitList(m);//初始化线性表Print(m);cout<<"请输入十个数据"<<endl;for(int i=0;i<10;i++){cin>>m.list[i];m.Size++;}Print(m);cout<<"向线性表中第r个位置插入s"<<endl;cout<<"请输入r,s"<<endl;int r;ElemType s;cin>>r>>s;cout<<"(m,r,s)"<<endl;//向线性表中插入元素InsertList(m,r,s);Print(m);cout<<"查找数据s或者查找第r个数据"<<endl;cin>>s>>r;GetList(m,s,r);Print(m);ElemType f=0;cout<<"删除第r个数据"<<endl;cin>>r;DeleteList(m,f,r);Print(m);cout<<"删除的数据是"<<f<<endl;}实验二链表操作实验学时:2学时实验类型:验证实验要求:必修一、实验目的和要求1、掌握链表的概念,了解线性表的链式存储结构,学会定义线性表的链式存储结构。
2、加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。
二、实验内容及步骤要求1、简单链表的基本操作(1) 编写链表基本操作函数。
①初始化链表InitList(LIST *L,int ms)②向链表指定位置插入元素InsertList1(LIST *L,int item,int rc)③向有序链表指定位置插入元素InsertList2(LIST *L,int item,int rc)④删除指定元素之的链表记录DeleteList(LIST *L,int item)⑤查找链表中的元素FindList(LIST *L,int item)(2) 调用上述函数实现下列操作,操作步骤如下:①从键盘输入一个数据元素x,插入到线性表中第i(包含1号位置)个位置;②从键盘输入一个数据元素关键字x或位置i(包含1号位置),从线性表中删除相应数据元素。
2、约瑟夫环问题(1) 约瑟夫(Joeph)问题的一种描述:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
(2) 编程实现约瑟夫环问题,利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
(3) 试设计一个程序求出出列顺序。
并设m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。
3、完成实验报告。
三、实验原理、方法和手段1、根据实验内容编程,上机调试、得出正确的运行程序。
2、编译运行程序,观察运行情况和输出结果。
四、实验条件运行Visual c++的微机一台五、实验结果与分析对程序进行调试,并将运行结果进行截图、对所得到的的结果分析。
六、实验总结记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等,并将其写入实验报告中。