数据结构实验指导书(实验1)
数据结构实验-实验指导书
实验一线性表操作一、实验目的1熟悉并掌握线性表的逻辑结构、物理结构。
2熟悉并掌握顺序表的存储结构、基本操作和具体的函数定义。
3熟悉VC++程序的基本结构,掌握程序中的用户头文件、实现文件和主文件之间的相互关系及各自的作用。
4熟悉VC++操作环境的使用以及多文件的输入、编辑、调试和运行的全过程。
二、实验要求1实验之前认真准备,编写好源程序。
2实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。
3不断积累程序的调试方法。
三、实验内容基本题:1对元素类型为整型的顺序存储的线性表进行插入、删除和查找操作。
加强、提高题:2、编写一个求解Josephus问题的函数。
用整数序列1, 2, 3, ……, n表示顺序围坐在圆桌周围的人。
然后使用n = 9, s = 1, m = 5,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作为输入数据,检查你的程序的正确性和健壮性。
最后分析所完成算法的时间复杂度。
定义JosephusCircle类,其中含完成初始化、报数出圈成员函数、输出显示等方法。
(可以选做其中之一)加强题:(1)采用数组作为求解过程中使用的数据结构。
提高题:(2)采用循环链表作为求解过程中使用的数据结构。
运行时允许指定任意n、s、m数值,直至输入n = 0退出程序。
实验二栈、队列、递归应用一、实验目的1熟悉栈、队列这种特殊线性结构的特性2熟练掌握栈、队列在顺序存储结构和链表存储结构下的基本操作。
二、实验要求1实验之前认真准备,编写好源程序。
2实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。
3不断积累程序的调试方法。
三、实验内容基本题(必做):1分别就栈的顺序存储结构和链式存储结构实现栈的各种基本操作。
2、假设以带头结点的循环链表表示队列,并且只设一个指针指向对尾结点,不设头指针,试设计相应的置队空、入队和出队的程序。
加强题:3设线性表A中有n个字符,试设计程序判断字符串是否中心对称,例如xyzyx和xyzzyx都是中心对称的字符串。
数据结构实验指导书
数据结构实验指导书实验1:顺序表基本操作一、实验目的1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。
3.掌握对多函数程序的输入、编辑、调试和运行过程。
二、实验要求1.预习C语言中结构体的定义与基本操作方法。
2.对顺序表的每个基本操作用单独的函数实现。
3.编写完整程序完成下面的实验内容并上机运行。
4.整理并上交实验报告。
三、实验内容:1.编写程序实现顺序表的下列基本操作:(1)初始化顺序表La。
(2)将La置为空表。
(3)销毁La。
(4)在La中插入一个新的元素。
(5)删除La中的某一元素。
(6)在La中查找某元素,若找到,则返回它在La中第一次出现的位置,否则返回0。
(7)打印输出La中的元素值。
2.编写程序完成下面的操作:(1)构造两个顺序线性表La和Lb,其元素都按值非递减顺序排列。
(2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列。
(3)假设两个顺序线性表La和Lb分别表示两个集合A和B,利用union_Sq操作实现A=A∪B。
四、思考与提高假设两个顺序线性表La和Lb分别表示两个集合A和B,如何实现A=A ∩B ?一、实验目的1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。
2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。
二、实验要求1.预习C语言中结构体的定义与基本操作方法。
2.对单链表的每个基本操作用单独的函数实现。
3.编写完整程序完成下面的实验内容并上机运行。
4.整理并上交实验报告。
三、实验内容1.编写程序完成单链表的下列基本操作:(1)初始化单链表La。
(2)在La中插入一个新结点。
(3)删除La中的某一个结点。
(4)在La中查找某结点并返回其位置。
数据结构实验指导书new(完整版)
数据结构实验指导书实验一线性表的创建与应用一、实验目的1、掌握线性表的定义2、掌握线性表的基本操作:插入、删除、查找以及线性表合并等运算在链接存储结构上的运算。
二、实验内容1、阅读并运行本实验程序(有序顺序表实现)2、用单链表方式实现本程序相应功能(有序单链表)3、利用有序单链表实现一元多项式的加法的功能。
三、实验要求1、认真阅读和掌握本实验的参考程序(有序顺序表)。
2、上机运行该程序。
3、保存和打印出程序的运行结果,并结合程序进行分析。
4、按照有序顺序表功能,重新改写程序并运行,打印出文件清单和运行结果5、创建有序单链表时,要用头插法和尾插法同时实现。
6、实现一元多项式的加法的功能,并输出结果。
7、最好能将结果写入到文本文件中。
四、注意事项:1、实验学时:4学时2、实验完成一周内提交实验报告(实验报告本)3、实验结果要求抓图打印4、严禁抄袭五、实验附件程序(有序顺序表)Odsqlist.h文件:#define LIST_INIT_SIZE 8 //线性表存储空间的初始分配量#define LISTINCREMENT 10 //线性表存储空间的分配增量#define OVERFLOW -2#define ERROR 0#define OK 1#define TRUE 1#define FALSE 0typedef int Status;typedef int ElemType;typedef struct {ElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)}SqList; // 俗称顺序表typedef SqList OdSqList; //有序顺序表Status InitList(OdSqList&); // 结构初始化void Destroy(OdSqList&); //销毁有序顺序表void ClearList(OdSqList&);//清空有序表Status ListEmpty(OdSqList);//判有序表为空int ListLength(OdSqList);//求表长int LocateElem(OdSqList,ElemType); // 查找void ListInsert(OdSqList&,ElemType); // 插入元素Status ListDelete(OdSqList&, int,ElemType& ); // 删除元素int ListDeletem(OdSqList&L, ElemType e); // 删除所有值为e的元素,返回删除的元素个数int ListDeletemn(OdSqList&, ElemType, ElemType ); // 删除所有值界于mink~maxk的元素,并返回删除的元素个数void ListTraverse(OdSqList);//遍历非递减有序线性表odsqlist.cpp文件:#include<stdio.h>#include<stdlib.h>#include "odsqlist.h"Status InitList( OdSqList& L ){// 构造一个空的线性表L.elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem)exit(OVERFLOW);L.length = 0;L.listsize = LIST_INIT_SIZE;return OK;} // InitListvoid ListTraverse(OdSqList L){//遍历线性表int i;printf("listsize is %d.\n",L.listsize);printf("listlength is %d.\n",L.length);printf("the list is:(");for(i=1;i<=L.length;i++)printf("%d ",L.elem[i-1]);printf(")\n");}int LocateElem(OdSqList L, ElemType e){// 在顺序表中查询第一个满足判定条件的数据元素,若存在,则返回它的位序,否则返回 0int i;i = 1; // i 的初值为第 1 元素的位序ElemType *p;p = L.elem; // p 的初值为第 1 元素的存储位置while (i <= L.length && *p++!=e) ++i;if (i <= L.length) return i;else return 0;}void ListInsert(OdSqList &L, ElemType e) {// 在顺序表L中保序插入新的元素eElemType *newbase,*p,*q;if (L.length >= L.listsize) { // 当前存储空间已满,增加分配newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof (ElemType));if (!newbase) exit(OVERFLOW);// 存储分配失败L.elem = newbase; // 新基址L.listsize += LISTINCREMENT; // 增加存储容量}q = &(L.elem[0]); // q 指示第1个元素位置for (p = &(L.elem[L.length-1]);p>=q&&*p>e; --p)*(p+1) = *p; // 插入位置及之后的元素右移*(p+1) = e; // 插入e++L.length; // 表长增1}Status ListDelete(OdSqList &L, int i, ElemType &e) {ElemType *p,*q;if ((i < 1) || (i > L.length)) return ERROR;// 删除位置不合法p = &(L.elem[i-1]); // p 为被删除元素的位置e = *p; // 被删除元素的值赋给 eq = L.elem+L.length-1; // 表尾元素的位置for (++p; p <= q; ++p) *(p-1) = *p;// 被删除元素之后的元素左移--L.length; // 表长减1return OK;}void Destroy(OdSqList& L){//销毁有序顺序表free(L.elem);}void ClearList(OdSqList& L){//清空有序表L.length=0;}Status ListEmpty(OdSqList L){//判有序表为空if(L.length==0)return TRUE;else return FALSE;}int ListLength(OdSqList L){//求表长return L.length;}int ListDeletem(OdSqList& L, ElemType e){// 删除所有值为e的元素,返回删除的元素个数ElemType *p,*q,*r;int i=0;//删除的元素个数p=&L.elem[0];//扫描指针for(q=&L.elem[L.length-1];*p<e&&p<=q;p++);if(p<=q&&*p==e){i++;for(r=p+1;*r==e&&r<=q;r++,i++);if(r<=q)for(;r<=q;r++,p++)*p=*r;}L.length-=i;return i;}int ListDeletemn(OdSqList& L, ElemType mink, ElemType maxk){// 删除所有值界于mink~maxk的元素,并返回删除的元素个数ElemType *p,*q,*r,temp;int i=0;if(maxk<mink){temp=maxk;maxk=mink;mink=temp;}p=&L.elem[0];for(q=&L.elem[L.length-1];*p<mink&&p<=q;p++);//p指针指向第1个大于等于mink的元素if(p<=q&&*p<=maxk){//若*p小于等于maxki++;for(r=p+1;*r<=maxk&&r<=q;r++,i++);//r指针指向第1个大于maxk的元素if(r<=q)for(;r<=q;r++,p++)*p=*r;}L.length-=i;return i;}app.cpp文件:#include<stdio.h>#include<stdlib.h>#include "odsqlist.h"void main(){OdSqList L;int k;char i;ElemType e,mink,maxk;printf("OdSqList is init……\n");i=InitList(L);ListTraverse(L);while(1){printf("\n\nplease select:\n");printf("1------insert\n");printf("2------traverse\n");printf("3------deletei\n");printf("4------deletek\n");printf("5------deletemink-maxk\n");printf("6------locate\n");printf("7------isempty\n");printf("8------length\n");printf("9------clearlist\n");printf("0------quit\n");scanf("%d",&k);switch(k){case 1:printf("please input e:");scanf("%d",&e);ListInsert(L,e);ListTraverse(L);scanf("%c",&i);printf("please press any key to continue……");scanf("%c",&i);break;case 2:ListTraverse(L);scanf("%c",&i);printf("please press any key to continue……");scanf("%c",&i);break;case 3:while(1){printf("please input delete i:");scanf("%d",&i);if(ListDelete(L,i,e)==ERROR)printf("delete positon is error!\n");else {printf("Deleted elem is %d\n",e);break;}}ListTraverse(L);scanf("%c",&i);printf("please press any key to continue……");scanf("%c",&i);break;case 4:printf("please input delete e:");scanf("%d",&e);ListTraverse(L);printf("%d elem is deleted.\n",ListDeletem(L,e));ListTraverse(L);scanf("%c",&i);printf("please press any key to continue……");scanf("%c",&i);break;case 5:printf("please input delete mink and maxk:");scanf("%d%d",&mink,&maxk);ListTraverse(L);printf("%d elem is deleted.\n",ListDeletemn(L,mink,maxk));ListTraverse(L);scanf("%c",&i);printf("please press any key to continue……");scanf("%c",&i);break;case 6:printf("please input locate e:");scanf("%d",&e);i=LocateElem(L,e);if(i==0)printf("locate Defaulted!\n");elseprintf("located no. is %d\n",i);ListTraverse(L);scanf("%c",&i);printf("please press any key to continue……");scanf("%c",&i);break;case 7:if(ListEmpty(L))printf("the orderlist is empty!\n");elseprintf("the orderlist is not empty!\n");scanf("%c",&i);printf("please press any key to continue……");scanf("%c",&i);break;case 8:printf("length is %d.\n",ListLength(L));scanf("%c",&i);printf("please press any key to continue……");scanf("%c",&i);break;case 9:ClearList(L);printf("the orderlist is empty!\n");scanf("%c",&i);print f("please press any key to continue……");scanf("%c",&i);break;case 0:Destroy(L);exit(1);break;}}}实验二栈(队列)的创建与应用一、实验目的1.掌握栈(队列)的基本操作:初始化栈(队列)、判栈(队列)为空、出栈(队列)、入栈(队列)等运算。
数 据 结 构 实 验 指 导 书
数据结构实验指导书计算机学院专业基础教研室2004年3月实验一线性表及其应用一、实验目的1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。
2.掌握线性表的顺序存储结构的定义及C语言实现。
3.掌握线性表的链式存储结构——单链表的定义及C语言实现。
4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。
5.掌握线性表在链式存储结构——单链表中的各种基本操作。
二、实验内容1.顺序线性表的建立、插入及删除。
2.链式线性表的建立、插入及删除。
三、实验步骤1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。
2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。
3.建立一个带头结点的单链表,结点的值域为整型数据。
要求将用户输入的数据按尾插入法来建立相应单链表。
四、实现提示1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。
因此,可用C语言的一维数组实现线性表的顺序存储。
在此,我们利用C语言的结构体类型定义顺序表:#define MAXSIZE 1024typedef int elemtype; /* 线性表中存放整型元素*/typedef struct{ elemtype vec[MAXSIZE];int len; /* 顺序表的长度*/}sequenlist;将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。
2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。
3.单链表的结点结构除数据域外,还含有一个指针域。
用C语言描述结点结构如下:typedef int elemtype;typedef struct node{ elemtype data; //数据域struct node *next; //指针域}linklist;注意结点的建立方法及构造新结点时指针的变化。
数据结构实验指导书
数据结构实验指导书《数据结构与算法》实验指导书《数据结构与算法》实验指导书实验1 顺序表一、实验目的(1)掌握顺序表的逻辑结构、存储结构及描述方式。
(2)掌握顺序表的定位、插入、删除等操作。
二、实验要求(1)调试程序要记录调试过程中出现的问题及解决办法;(2)给出每个问题的算法或画出流程图;(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;(4)做完实验后给出本实验的实验报告。
三、实验设备、环境奔腾以上计算机,装有Turbo C 2.0或Visual C++软件四、实验步骤及内容实验步骤:1.根据题目,编写程序。
2.上机调试通过。
3.按照实验报告格式,撰写各实验报告。
实验内容:(1)编写一个函数print_all_data,该函数的作用是逐个输出顺序表中所有数据元素的值。
编写主函数,从键盘输入顺序表,调用函数print_all_data,测试结果。
(2)编写顺序表定位操作函数locata,该函数的作用是在顺序表中查找是否存在数据元素的值与变量x的值相等。
如果存在满足条件的数据元素,则返回顺序表中和x值相等的第1个数据元素在表中的下标;如果不存在,则返回-1。
编写主函数,从键盘输入顺序表,以及变量x的值,调用函数locate,测试结果。
(3)编写一个函数insert,该函数的作用是在递增有序的顺序表中插入一个新结点x,要求保持顺序表的有序性,输出插入前后顺序表状态。
编写主函数,从键盘输入顺序表以及变量x的值,调用函数insert,测试结果。
(4)编写一个函数delete,该函数的作用是删除顺序表中所有等于X的数据元素。
若顺序表中没有满足条件的数据元素,则输出合适的信息。
若有满足条件的数据元素,则输出删除前后顺序表状态。
编写主函数,从键盘输入顺序表以及变量x的值,调用函数153《数据结构与算法》实验指导书delete,测试结果。
五、讨论、思考题1、如何在排列有序的顺序表中插入新元素,而保证顺序表的有序性?2、如何在排列有序的顺序表中删除某元素,而保证顺序表的有序性?实验2 单链表一、实验目的(1)掌握单链表的逻辑结构、存储结构及描述方式。
数据结构实验指导书(本科正式)
《数据结构》实验指导书实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素1、通过键盘读取元素建立线性表;2、指定一个元素,在此元素之前插入一个新元素;3、指定一个元素,删除此元素。
二、用C语言编程实现建立一个单链表,并在此表中插入一个元素和删除一个元素1、通过键盘读取元素建立单链表;2、指定一个元素,在此元素之前插入一个新元素;3、指定一个元素,删除此元素。
三、用C语言编程实现两个按递增顺序排列线性表的合并1、编程实现合并按递增顺序排列的两个顺序表算法;2、编程实现合并按递增顺序排列的两个单链表算法。
【思考问题】结合实验过程,回答下列问题:1、何时采用顺序表处理线性结构的问题为最佳选择;2、何时采用链表处理线性结构的问题为最佳选择。
【实验报告要求】1、根据对线性表的理解,如何创建顺序表和单链表;2、实现顺序表插入和删除操作的程序设计思路;3、实现链表插入和删除操作的程序设计思路;4、实现两表合并操作的程序设计思路;5、调试程序过程中遇到的问题及解决方案;6、本次实验的结论与体会。
《数据结构》实验指导书(新)
数据结构实验指导书实验一线性表[实验目的]1.了解顺序表的结构特点及有关概念,掌握顺序表建立、插入、删除的基本操作算法。
2.了解单链表的结构特点及有关概念,掌握单链表建立、插入、删除的基本操作算法。
[实验内容]1.顺序表的实践。
1)建立4个元素的顺序表list[]={2,3,4,5},实现顺序表建立的基本操作。
2)在list[]={2,3,4,5}的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。
3)在list[]={2,3,4,9,5}中删除指定位置(i=3)上的元素9,实现顺序表的删除的基本操作。
2.单链表的实践。
1)建立一个包括头结点和3个结点的(4,2,1)的单链表,实现单链表建立的基本操作。
2)在已建好的单链表中的指定位置(x=2)插入一个结点3,实现单链表插入的基本操作。
3)在一个包括头结点和4个结点的(4,2,3,1)的单链表的指定位置删除一个结点,实现单链表删除的基本操作。
[实验要点及说明]线性表(linear list)是n(n≥0)个数据元素a1,a2,…a n组成的有限序列。
其中n 称为数据元素的个数或线性表的长度,当n=0时称为空表,n>0时称为非空表。
通常将非空的线性表记为(a1,a2,…,a n),其中的数据元素a i(1≤i≤n)是一个抽象的符号,a i是第i个数据元素,称i为数据元素a i在线性表中的位置。
其具体含义在不同情况下是不同的,即它的数据类型可以根据具体情况而定,本书中,我们将它的类型设定为elemtype,表示某一种具体的已知数据类型。
顺序表也称为线性表的顺序存储结构。
其存储方式为:在内存中用一组地址连续的存储单元依次存储线性表的数据元素,但该连续存储空间的大小要大于或等于顺序表的长度。
一般让线性表中第一个元素存放在连续存储空间第一个位置,第二个元素紧跟着第一个之后,其余依此类推。
可定义顺序表如下:#define maxnumelemtype list[maxnum];int num=-1;线性表的链式存贮结构,也称为链表。
《数据结构》实训指导书
《数据结构》实训指导书实训一线性表基本操作算法设计一、实训目的与要求1、掌握线性表的顺序存储结构的实现及其基本操作的算法设计;2、掌握线性表的链式存储结构的实现及其基本操作的算法设计;3、掌握算法转化为C程序的方法。
二、实训内容1、根据线性表L=(a,b,c,d,e,f),编写程序建立其顺序存储结构并完成插入或删除操作。
2、根据线性表L=(a,b,c,d,e,f),编写程序建立其链式存储结构并完成插入或删除操作。
三、实训步骤1、根据算法设计编写源程序;2、输入并编辑源程序;3、运行并分析程序;四、实训总结与体会[根据本次实训过程,总结你对线性表基本操作算法设计的基本体会]实训二栈和队列基本操作的算法设计一、实训目的与要求1、掌握栈的基本操作算法设计的实现;2、掌握队列的基本操作算法设计的实现。
二、实训内容1、根据栈S=(a,b,c,d,e),建立其顺序存储结构或链式存储结构,并完成对该栈的进栈或出栈操作;2、根据队列Q=(a,b,c,d,e),建立其顺序存储结构或链式存储结构,并完成对该队列的进队或出队操作;三、实训步骤1、根据算法编写源程序;2、输入并编辑源程序;3、调试、分析程序。
四、实训总结[根据本次实训内容和过程,总结你对栈、队列的基本操作算法设计的体会]实训三二叉树的遍历算法设计一、实训目的与要求1、掌握二叉树的链式存储结构的算法实现;2、掌握遍历二叉树的算法实现。
二、实训内容1、根据算法编写程序建立下图所示二叉树的链式存储结构(建立二叉链表);2、根据算法编写程序完成对该二叉树的中序遍历(或先序遍历、后序遍历)。
三、实训步骤1、根据算法编写程序;2、输入并编辑程序;3、运行并分析程序。
四、实训总结与体会【根据本次实训内容及过程,简述对二叉树存储结构的实现及遍历二叉树算法设计的体会】实训四图的存储及遍历算法设计一、实训目的与要求1、掌握图的邻接矩阵、邻接表存储结构的算法实现;2、掌握图的遍历算法设计。
《数据结构》实验指导书(新教学计划)
数据结构实验指导书数据结构实验指导书目录数据结构实验指导书 (1)目录 (1)实验指导书概述 (2)实验题目 (3)实验一单链表的插入、删除 (3)[实验目的] (3)[实验内容] (3)[测试数据] (3)[实现提示] (3)实验二栈及其应用 (5)[实验目的] (5)[实验内容] (5)[测试数据] (5)实验三二叉树的递归算法 (5)[实验目的] (5)[实验内容] (6)[测试数据] (6)实验四查找及排序算法的应用 (7)[实验目的] (7)[实验内容] (7)[测试数据] (7)实验指导书概述“数据结构”是计算机专业一门重要的专业技术基础课程,是一门关键性核心课程。
本课程系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了多种常用的查找和排序技术,并对其进行了性能分析和比较,内容非常丰富。
本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。
由于以下原因,使得掌握这门课程具有较大难度:∙内容多,时间短,给学习带来困难;∙贯穿全书的动态链表存储结构和递归技术是学习中的重点和难点;∙隐含在各部分的技术和方法丰富,也是学习的重点和难点;∙先修课程中所介绍的专业性知识不多,加大了学习难度。
由于数据结构课程的技术性与实践性,《数据结构课程实验》的设置十分必要。
为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。
数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。
在掌握基本算法的基础上,掌握分析、解决实际问题的能力。
通过实验实践内容的训练,突出构造性思维训练的特征, 提高学生组织数据及编写大型程序的能力。
数据结构实验指导书
数据结构实验指导书一、实验目的本实验旨在通过实践操作,加深对数据结构的理解,掌握数据结构的基本操作和算法设计。
二、实验内容1. 实验环境搭建:a. 安装编程环境,如C++编译器或Java开发环境。
b. 配置相关的开发工具和库文件。
2. 实验一:线性表的实现与应用a. 实现线性表的基本操作,包括初始化、插入、删除、查找等。
b. 实现线性表的应用,如实现一个简单的通讯录管理系统。
3. 实验二:栈和队列的实现与应用a. 实现栈的基本操作,包括入栈、出栈、判空等。
b. 实现队列的基本操作,包括入队、出队、判空等。
c. 实现栈和队列的应用,如实现一个简单的表达式计算器。
4. 实验三:二叉树的实现与应用a. 实现二叉树的基本操作,包括创建、插入、删除、遍历等。
b. 实现二叉树的应用,如实现一个简单的文件系统。
5. 实验四:图的实现与应用a. 实现图的基本操作,包括创建、插入节点、插入边、遍历等。
b. 实现图的应用,如实现一个简单的社交网络系统。
三、实验步骤1. 实验环境搭建:a. 下载并安装编程环境,如Dev-C++或Eclipse。
b. 配置相关的开发工具和库文件,确保能够正常编译和运行程序。
2. 实验一:线性表的实现与应用a. 设计线性表的数据结构,包括元素类型和相关操作。
b. 实现线性表的初始化、插入、删除和查找等基本操作。
c. 设计并实现一个简单的通讯录管理系统,包括添加联系人、删除联系人和查找联系人等功能。
3. 实验二:栈和队列的实现与应用a. 设计栈和队列的数据结构,包括元素类型和相关操作。
b. 实现栈的入栈、出栈和判空等基本操作。
c. 实现队列的入队、出队和判空等基本操作。
d. 设计并实现一个简单的表达式计算器,支持基本的四则运算。
4. 实验三:二叉树的实现与应用a. 设计二叉树的数据结构,包括节点类型和相关操作。
b. 实现二叉树的创建、插入、删除和遍历等基本操作。
c. 设计并实现一个简单的文件系统,支持文件和文件夹的创建、删除和查找等功能。
数据结构实验指导书
实验一线性表的基本操作一、实验目的线性表是最简单的一种线性结构,它有两种存储方法:顺序存储和链式存储。
实验目的如下:1、会定义线性表的顺序存储结构和链式存储结构。
2、熟悉顺序表和链表的一些基本操作和应用。
3、加深对线性表的理解,逐步培养解决实际问题的编程能力。
二、实验环境运行C或VC++的微机。
三、实验内容1.基本操作:●初始化线性表●向线性表指定位置插入元素●删除指定元素值的线性表记录●删除指定位置的线性表记录●查找线性表中的元素●输出线性表元素2.提高题目(1)已知线性表LA的数据元素(n个,n为偶数),现要求将LA 拆开成两个新的线性表LB,LC。
要求LB中的数据元素为LA中的奇数位序的数据元素(a1, a3, …, a n-1),LC中的数据元素为LA中的偶数位序的数据元素(a2, a4, …, a n)。
2. 已知线性表LA的数据元素(n个),现要求将LA的数据元素复制到另一个线性表LB中。
3. 设有一个线性表采用顺序存储结构,表中的数据元素值为正整数(n个)。
设在O(n) 时间内,将线性表分成两为两部分,其中左半部分每个元素都小于原表的第一个元素,而右半部分则相反。
4. 将一个头结点指针为a的单链表A分解成两个单链表A和B,其头结点指针分别为a和b,使得A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
5. 约瑟夫问题:设编号为1,2,…,n的n(n>0)个人按顺时针方向围坐一圈,每人持有一正整数密码。
开始时任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m 时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。
如此下去,直到所有人全部出列为止。
令n最大值取30。
要求设计一个程序模拟此过程,求出出列编号序列(采用循环单链表结构)。
四、实验报告所有的基础操作和5到题目都需要课堂检查,直接打分。
《数据结构》实验指导书
实验一线性表的操作一、实验目的1.掌握在VC++6.0的集成环境中调试程序的基本方法。
2.掌握线性表的插入和删除操作在顺序存储结构和链式存储结构上的实现。
二、实验内容(三选一)(一)线性表的插入和删除操作在顺序存储结构和链式存储结构上的实现。
(1)线性表的插入和删除操作在顺序存储结构上的实现。
其中函数ListInsert_Sq的功能是在顺序线性表中第i个元素之前插入一个元素,函数ListDelete_Sq的功能是删除顺序线性表中第i个元素。
#define LIST_INIT_SIZE 1000#define LISTINCREMENT 10#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define OK 1#define ERROR 0#define OVERFLOW -2//顺序表的存储结构定义typedef int Status;typedef int ElemType;typedef struct{ElemType *elem; //首地址int length; //顺序表的长度int listsize; //顺序表的存储容量} SqList;Status InitList_Sq(SqList &L) // 顺序表的初始化{}// InitList_Sq(Status ListInsert_Sq (SqList &L, int i, ElemType e) //插入{ //在顺序表的第i个位置插入值e为的元素}// ListInsert_SqStatus ListDelete_Sq(SqList &L, int i, ElemType &e) //删除{ //在顺序表的第i个位置删除一个元素,值在存进e中}// ListDelete_Sqint main( ){ElemType y;SqList L;int i,n;InitList_Sq(L); /* 初始化线性表*/printf("输入顺序表需存进的元素数量!\n");scanf("%d",&n);while(n<1 || n>10){printf("请输入1--10之间的整数!\n");scanf("%d",&n);}/* 以上循环语句的功能是控制输入数据个数的合法性,可以修改*/printf("依次输入存进顺序表中的数据元素:\n");for(i=1;i<=n;i++){scanf(“%d”,&y);ListInsert_Sq(L,i,y) ;}/* 以上循环语句的功能是依次输入要存进顺序表中的元素,并存进顺序表*/printf("顺序表中的元素为:");for(i=0; i<L.length; i++) printf("%d\t",L.elem[i]);/* 以上循环语句的功能是依次输出顺序表中的元素*/printf("\n");printf(“输入要删除元素的位置!\n”);scanf(“%d”,&n);if(ListDelete_Sq(L,n,y)==OK) { printf(“删除成功!”); printf("被删除的元素是:%d\n",y); }printf("顺序表中的元素为:");for(i=0; i<L.length; i++) printf("%d\t",L.elem[i]);/* 以上循环语句的功能是依次输出顺序表中的元素*/printf("\n");system("pause");return 0;}实验程序运行示例:(2)线性表的建立、插入、删除、打印和查找操作在链式存储结构上的实现。
《数据结构》实验指导书(C语言版)(浦江学院)
实验1: 顺序表的操作实验一、实验名称和性质二、实验目的1.掌握线性表的顺序存储结构的表示和实现方法。
2.掌握顺序表基本操作的算法实现。
3.了解顺序表的应用。
三、实验内容1.建立顺序表。
2.在顺序表上实现插入、删除和查找操作(验证性内容)。
3.删除有序顺序表中的重复元素(设计性内容)。
四、实验的软硬件环境要求硬件环境要求:PC机(单机)使用的软件名称、版本号:Windows环境下的VC++6.0五、知识准备前期要求熟练掌握了C语言的编程规则、方法和顺序表的基本操作算法。
六、验证性实验1.实验要求编程实现如下功能:(1)根据输入顺序表的长度n和各个数据元素值建立一个顺序表,并输出顺序表中各元素值,观察输入的内容与输出的内容是否一致。
(2)在顺序表的第i个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值。
(3)删除顺序表中第i个元素,并输出删除后的顺序表中各元素值。
(4)在顺序表中查找值为e的数据元素,如果查找成功,则显示“查找成功”和该元素在顺序表中的位置,否则显示“查找失败”。
2. 实验相关原理线性表的顺序存储结构称为顺序表,顺序表的存储结构描述为:#define MAXLEN 30 /*线性表的最大长度*/typedef struct{Elemtype elem[MAXLEN]; /*顺序表中存放元素的数组,其中elemtype为抽象数据类型,在程序具体实现时可以用任意类型代替*/int length; /*顺序表的长度,即元素个数*/}Sqlist; /*顺序表的类型*/【核心算法提示】(1)顺序表插入操作的基本步骤:要在顺序表中的第i个数据元素之前插入一个数据元素x,首先要判断插入位置i是否合法,假设线性表的表长为n,则i的合法值范围:1≤i ≤n+1,若是合法位置,就再判断顺序表是否满,如果满,则增加空间或结束操作,如果不满,则将第i个数据元素及其之后的所有数据元素都后移一个位置,此时第i个位置已经腾空,再将待插入的数据元素x插入到该位置上,最后将线性表的表长增加1。
《数据结构》实验指导(一)-无删减范文
《数据结构》实验指导(一)数据结构实验指导(一)1. 实验背景数据结构是计算机科学中的一个重要概念,它描述了如何组织和存储数据以及如何通过不同的操作来访问和修改这些数据。
在本实验中,我们将学习和实践数据结构中的线性表和链表。
2. 实验目的通过本次实验,我们将达到以下目的:- 理解线性表和链表的概念- 学会如何使用线性表和链表来解决常见的问题- 掌握线性表和链表的基本操作3. 实验内容3.1 线性表线性表是由 n 个数据元素 a1, a2, , an 组成的有序序列。
常见的线性表有数组和链表两种实现方式。
3.1.1 线性表的基本操作线性表的基本操作包括:- 初始化线性表- 判断线性表是否为空- 获取线性表的长度- 获取线性表中的元素- 在线性表的指定位置插入元素- 删除线性表中的指定元素- 清空线性表3.1.2 数组数组是一种连续的内存空间,可以存储相同类型的数据元素。
在数组中,每个元素的位置是通过下标来访问的,下标从 0 开始。
3.1.2.1 数组的插入操作数组的插入操作是将一个元素插入到数组的指定位置,同时需要将原位置的元素及其后续元素后移一位。
3.1.2.2 数组的删除操作数组的删除操作是将数组中指定位置的元素删除,同时需要将后续元素前移一位。
3.2 链表链表是一种离散的数据结构,它的元素包含两个部分:数据和指针。
每个节点都包含一个数据元素和一个指向下一个节点的指针。
3.2.1 链表的基本操作链表的基本操作包括:- 初始化链表- 判断链表是否为空- 获取链表的长度- 获取链表中的元素- 在链表的指定位置插入元素- 删除链表中的指定元素- 清空链表3.2.2 单链表单链表是最简单的链表形式,它的每个节点只包含一个指向下一个节点的指针。
3.2.2.1 单链表的插入操作单链表的插入操作是将一个元素插入到链表的指定位置,同时需要调整指针的指向。
3.2.2.2 单链表的删除操作单链表的删除操作是将链表中指定位置的节点删除,同时需要调整指针的指向。
数据结构实验指导书1
北京林业大学实验任务书备注:实验共分4次,其中实验1――实验3为设计性实验,实验4为综合性实验,具体安排下面一一列出。
北京林业大学09学年—10学年第 2学期数据结构实验任务书专业名称:实验学时: 4课程名称:数据结构任课教师:李冬梅实验题目:线性表的基本操作实验环境: Visual C++实验目的:1、掌握线性表的定义;2、掌握线性表的基本操作,如建立、查找、插入和删除等。
实验内容:定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:(1) 根据指定学生个数,逐个输入学生信息;(2) 逐个显示学生表中所有学生的相关信息;(3) 根据姓名进行查找,返回此学生的学号和成绩;(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);(5) 给定一个学生信息,插入到表中指定的位置;(6) 删除指定位置的学生记录;(7) 统计表中学生个数。
实验提示:学生信息的定义:typedef struct {char no[8]; //8位学号char name[20]; //姓名int price; //成绩}Student;顺序表的定义typedef struct {Student *elem; //指向数据元素的基地址int length; //线性表的当前长度}SqList;链表的定义:typedef struct LNode{Student data; //数据域struct LNode *next; //指针域}LNode,*LinkList;实验要求:(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表根据姓名进行查找的算法和插入算法的流程图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//顺序表存储结构定义 #define MaxSize 50 //线性表的最大容量,假设为50 typedef struct Stu{ long int num;//学号 char name[20];//姓名 char sex;//性别 int age;//年龄 int score;//分数 }Elemtype;//定义数据元素为学生信息 typedef struct SqList { Elemtype *data; int length; // 线性表长度 }SqList; // 顺序表数据类型为SqList 3. 程序结构 a) 函数说明 int Menu();//系统主菜单 int QMenu();//查询菜单 void PrintElem(Elemtype a);//打印输出数据元素a的各数据项 void Init_SqList(SqList &L);//构造一个空的顺序表L void SaveList(SqList L,FILE *out);//保存顺序表L的数据 void Creat_SqList(SqList &L,FILE *in); //建表 void Traver_SqList(SqList L); //查询(遍历顺序表L) SqList Insert_SqList (SqList &L); //添加 b) 函数实现 //基本操作的实现 int Menu()//系统主菜单 { int n; printf("----------------------------\n"); printf("******************学生信息管理系统 ******************\n\n"); printf("\t1.导入数据\n"); printf("\t2.查询(全部信息、男生信息、女生信息)\n"); printf("\t3.添加学生信息\n"); printf("\t4.删除学生信息\n"); printf("\t5.统计人数(男生、女生、不及格、优秀等)\n"); printf("\t6.排序(升序、降序)\n");
实验一 顺序表的基本操作
1、 实验目的
1. 掌握使用VC++6.0调试程序的基本方法;
2. 掌握线性表的顺序存储结构的类型定义; 3. 掌握顺序表的基本操作的实现,如:插入、删除、遍 历、查找、排序、修改、合并等; 4. 掌握顺序表的应用。
2、 实验环境
1. 台式计算机每人一台; 2. 软件:Visual C++6.0
3、 注意事项
在U盘上创建一个以“学号姓名”命名的文件夹(如: 20090001张三),专门用于存储数据结构实验的程序及实 验报告。
4、 实验内容
示例程序:简易学生信息管理系统(SqList.cpp)
本简易学生信息管理系统要求以顺序表作为学生信息的载体,并实 现学生信息的查询、添加、删除、统计、排序、保存等基本功能。本示 例程序已经实现了简易学生信息管理中的查询、添加和保存等功能,要 求学生对该系统进行完善,继续添加相关函数以提高其实用性。 1. 文件结构设计 a) 原始数据:保存在文件input1.txt中。 b) 输出数据:保存在文件output1.txt中。 2. 数据结构设计
SqList Insert_SqList (SqList &L) {// 在顺序表L的第 i 个位置上插入(添加)一个新元素 Elemtype x; int i; printf("请输入插入的位置(1..%d)i=",L.length+1); scanf("%d",&i); if ((i<1) || ( i>L.length+1)) //检查插入位置的正确性 { printf ("插入位置i不合理!"); exit(1); } //不合理,中止程序 运行 if (L.length >= MaxSize) // 顺序表是否已满 { printf ("“顺序表已满,不能再插入!”"); exit(1); } // 表满,不能插入 printf("请输入添加的元素(学号 姓名 性别 年龄 成绩)\n x="); scanf("%d %s %c %d %d",&x.num,,&x.sex,&x.age,&x.score); for (int m=L.length-1; m>=i-1; --m) L.data [m+1]=L.data[m];// 数据后移 //L.data [m+1] = L.data[m]; // 数据后移 L.data[i-1]=x;//新元素插入 // L.data [i-1] = x; //新元素插入 L.length++; //表长+1 return L; //插入成功,返回 } void SaveList(SqList L,FILE *out) {//将顺序表L的数据存入文件output1.txt int i; fprintf(out,"%d\n",L.length);//保存表长 for(i=0;i<L.length;i++) //保存表中数据 fprintf(out,"%8d %-8s %c %4d %4d\n", L.data[i].num,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].score); } c) 主函数
void main() {//通过文件input1.txt输入数据,结果输出到文件output1.txt //打开输入输出文件 FILE *in,*out; if((in=fopen("input1.txt","r"))==NULL) { printf("cannot open infile\n"); exit(0); } if((out=fopen("output1.txt","w"))==NULL) { printf("cannot open infile\n"); exit(0); } int choice; SqList L; Init_SqList(L);//系统文件初始化,构造空表L while(1) { choice=Menu(); switch(choice) { case 1: Creat_SqList(L,in); //导入数据,根据文件input.txt读入的数据建立顺序表L break; case 2: Traver_SqList(L);//查询,输出顺序表 break; case 3: Insert_SqList(L);// 在顺序表L中插入一个新元素 break; case 4: break;//删除元素
{//建表,从文件指针in所指文件读取数据,以尾插法建立顺序表L int i; fscanf(in,"%d",&L.length);//读取数据元素个数,即表长n //printf("表长n=%d\n",L.length); for(i=0;i<L.length;i++)//从文件input1.txt读取数据存入L fscanf(in,"%d %s %c %d %d",&L.data[i].num, L.data[i].name,&L.data[i].sex,&L.data[i].age,&L.data[i].score); } void Traver_SqList(SqList L) {//遍历顺序表L(输出L中的数据序列) //查询(1.全部信息 2.男生信息 3.女生信息 4.退出 ) int i,choice=QMenu(); switch(choice) { printf("\n(学号 姓名 性别 年龄 分数)\n"); case 1://全部信息 for(i=0;i<L.length;i++) PrintElem(L.data[i]); /*等价于:printf("(%8d %-8s %c %4d %4d)\n",L.data[i].num, L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].score);*/ printf("\n");break; case 2://男生信息 for(i=0;i<L.length;i++) if(L.data[i].sex=='m') PrintElem(L.data[i]); printf("\n");break; case 3://女生信息 for(i=0;i<L.length;i++) if(L.data[i].sex=='f') PrintElem(L.data[i]); printf("\n");break; case 4:return;//退出 } }
printf("\t7.修改(修改姓名、性别、年龄、分数等属性值) \n"); printf("\t8.存盘\n"); printf("\t0.退出\n\n"); printf("**********************欢迎访问 **********************\n"); printf("----------------------------\n"); scanf("%d",&n); return(n); } int QMenu()//查询菜单 { int n; printf("\n\t***********欢迎进入查询系统************\t\n"); printf("\t1.全部信息"); printf("\t2.男生信息"); printf("\t3.女生信息"); printf("\t4.退出\t"); printf("\n\t**************************************\t\n"); scanf("%d",&n); return(n); } void PrintElem(Elemtype a) {//打印输出数据元素a的各数据项,即输出单个学生信息 printf("(%8d %-8s %c %4d %4d)\n", a.num,,a.sex,a.age,a.score); } void Init_SqList(SqList &L) {//构造一个空的顺序表L L.data=(Elemtype *)malloc(MaxSize*sizeof(Elemtype)); if(!L.data) exit(1); L.length=0; } void Creat_SqList(SqList &L,FILE *in)