数据结构实验指导数据结构实验指导南昌大学计算机系2011年3月数据结构是计算机程序设计的重要理论技术基础,不仅是计算机学科的核心课程,而且己成为其它理工专业的热门选修课程。
数据结构课程主要研究信息的逻辑结构及其基本操作在计算机中的表示和实现,其教学要求之一是训练学生进行复杂程序设计的技能和培养良好程序设计的习惯,但由于这门课程相对抽象且内容复杂,因此,在数据结构的整个教学过程中,辅助课堂教学的实验非常有助于帮助学生学好这门课程,培养学生独立思考和解决问题的能力,锻炼学生的动手能力,希望能对我校的《数据结构》教学工作有所帮助。
实验1:C++ 语言基础练习 (1)实验2:线性表及其应用 (4)实验3:栈和队列 (12)实验4:串及其应用 (14)实验5:数组 (16)实验6:二叉树及其应用 (18)实验7:图的应用 (20)实验8:查找、排序 (22)附录:实验报告格式 (24)实验1:C++ 语言基础练习一、实验目的对C++语言的复习,增强学生对结构体数组和指针的学习,尤以结构体的应用和指针的操作, 还有C++中类作为重点。
二、问题描述1、构造一个学生结构体数组,成员包括学号,姓名,四门成绩,以及平均成绩;2、从键盘上输入学生的学号,姓名和四门成绩;3、找出学生中考试没有通过的学生姓名并输出;找出考试在90分以上的学生并输出。
三、实验要求1、要求用链表存储学生的记录,并设计出输入和查找的基本操作算法。
2、在实验过程中,分析算法的时间复杂度和空间复杂度进行分析。
四、实验环境PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境五、实验步骤1、用所选择的语言实现算法;3、测试程序,并对算法进行时间和空间复杂度分析。
六、实验报告要求实验报告应包括以下几个部分:1、问题描述;2、测试结果的分析与讨论,在测试过程中遇到的主要问题及采取的解决措施。
3、设计与实现过程中的体会,进一步的改进设想。
4、实现算法的程序清单,应有足够的注释。
【算法实现】#define m 4 /*每个学生所学习课程数*/#define NULL 0typedef struct stnode{int id; /*学号*/char name[16]; /*姓名*/int class[4]; /*所有课程成绩分别存储在class[0],class[1],class[2],…中*/float ave; /*学生个人所有课程的平均成绩*/struct stnode *next; /*指针域*/}students;students *head; /*head 为指向学生单链表的头指针,且为全局变量*/int n; /*参加成绩管理的班上的学生个数*/average() /*求每门课程的平均成绩的函数*/{int i,j; /*i为课程数,j为学生数*/float sum,aver;students *p;printf("Class Average result\n");printf("*******Class*********Class Average*******\n");for(i=0;i<m;i++) /*分别求出所有课程的平均分,循环次数为所有课程的数目*/{j=0;sum=0;p=head;while(p->next) /*求某一门课程的所有学生的得分总和*/{sum=sum+p->class[i];p=p->next;j++;}aver=sum/j; /*求某一门课程的平均分*/printf(" Class%d %16.2f\n",i+1,aver);}printf("*****************************************\n\n");}nopass() /*找含有课程不及格的学生,如有则输出它的学号、姓名、所有课程成绩、它的所有课程的平均分*/{int i,j;students *p;p=head; /*从第1个结点开始查找*/printf("NO Pass result\n"); /*输入不格的结果*/printf("*******ID*******Name*********Class**********Average***\n");while(p->next) /*最后一个结点无数据,不用输出*/{i=0;while(i<m){if(p->class[i]<60){printf("%8d%10s",p->id,p->name); /*输出不及格学生的学号、姓名*/for(i=0;i<m;i++) /*输出不及格学生的所有课程成绩*/printf("%6d",p->class[i]);printf("%8.2f\n",p->ave);break;}elsei++; /*查找该同学的下一门课程*/}p=p->next; /*查找下一个同学*/}printf("*******************************************************\n\n");}over90( ) /*查找所有课程个人平均分在90分以上(包含90分)的学生,如有则输出该学生的学号*/{students *p;p=head; /*从表头开始查找*/while(p->next) /*直到倒数第二个结点为止,倒数第一个结点数据*/{if(p->ave>=90.0) /*找到则输出该学生的学号*/{printf("\n");printf("average over 90 its id is %d\n",p->id);p=p->next;}else /*否则查找下一个结点*/p=p->next;}}main(){ students *p,*q;int i,j;float sum;clrscr();printf("please student num!\n");scanf("%d",&n); /*n为学生个数*/head=(students *)malloc(sizeof(students));q=head;for(i=0;i<n;i++) /*创建单链表*/{printf("input student%d its ID,name\n",i+1);p=q;scanf("%d\n",&p->id); /*输入学生的学号*/scanf("%s",&p->name); /*输入学生姓名*/printf("\n");printf("input student%i its score\n",i+1);for(j=0;j<m;j++) /*输入每个学生的所课程的成绩*/scanf("%d",&p->class[j]);q=(students *)malloc(sizeof(students));q->next=NULL;p->next=q;}p=head;while(p->next) /*求每个学生个人所有课程的平均成绩*/{sum=0;for(j=0;j<m;j++)sum=sum+p->class[j];p->ave=sum/m;p=p->next;}average();nopass();over90();}实验2:线性表及其应用一、实验目的帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。
二、问题描述1、构造一个空的线性表L。
2、在线性表L的第i个元素之前插入新的元素e;3、在线性表L中删除第i个元素,并用e返回其值。
三、实验要求1、分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线性表的基本操作算法。
2、在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行分析。
四、实验环境PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境五、实验步骤1、用学生选择的语言,设计出线性表的顺序和链表存储结构;2、设计出这两种存储结构下的线性表的插入、删除算法;4、用所选择的语言实现算法;5、测试程序,并对不同存储结构下的算法分析。
六、实验报告要求实验报告应包括以下几个部分:1、问题描述;2、设计两种存储结构与核心算法描述;3、测试结果的分析与讨论,在测试过程中遇到的主要问题及采取的解决措施。
4、设计与实现过程中的体会,进一步的改进设想。
5、实现算法的程序清单,应有足够的注释。
七、思考题1、如何设计和实现基本线性表在两种存储结构下就地逆置算法?2.1 实现基本线性表的运算【算法实现】#define null 0typedef int ElemType;typedef struct node{ElemType data; /*数据域*/struct node *next; /*指针域*/}Lnode; /*定义基本线性表的结点类型*/Lnode *head; /*定义指向基本线性表的表头指针为全局变量*/ int length (Lnode *p) /*求指针p指向的基本线性表的长度*/{int n=0; /*结点位置计数器*/Lnode *q=p; /*临时指针q*/while (q!=null) /*当基本线性表不空时,统计基本线性表中的结点数*/{n++;q=q->next;}return(n); /*返回统计的结点数*/}ElemType get(Lnode *p,int i) /*求指针p指向的基本线性表中的第i个结点的值*/{int j=1; /*查找结点位置的计数器*/Lnode *q=p; /*定义临时指针 q*/while (j<i&&q!=null) /*查找结点i是否存在*/{q=q->next;j++;}if(q!=null) /*如果存在,则返回其数据域的值*/return(q->data);else /*否则,输出“位置参数不正确”*/printf("位置参数不正确!\n");}int locate(Lnode *p,ElemType x)/*求指针p指向的基本线性表中的数据元素x的位置序号*/{int n=0; /*结点位置计数器*/Lnode *q=p; /*定义临时指针 q*/while (q!=null&&q->data!=x) /*在基本线性表中查找数据元素x的位置*/{q=q->next;n++;}if(q==null) /*如果不存在,则返回-1*/else /*否则返回结点的位置序号*/return(n+1);}void insert(ElemType x,int i) /*在基本线性表的位置i,插入数据元素x*/ {int j=1; /*结点位置计数器*/Lnode *s,*q; /*定义临时指针变量p, q*/s=(Lnode *)malloc(sizeof(Lnode)); /*生成新结点*/s->data=x; /*并将新结点的数据域置为x*/q=head;if(i==1) /*如果插入位置是1,则将新结点插入到表头*/{s->next=q;head=s;}else /*否则,查找插入位置*/{while((j<i-1)&&(q->next!=null)){q=q->next;j++;}if(j==i-1) /*将新结点插入到位置i*/{s->next=q->next;q->next=s;}else /*插入位置不存在*/printf("位置参数不正确!\n");}}void delete(Lnode *p,int i) /*将指针p指向的基本线性表中的位置i的数据元素删除*/{int j=1; /*结点位置计数器*/Lnode *q=p,*t;if(i==1) /*如果位置序号为1,则将基本线性表的第1个数据元素结点删除*/{t=q;p=q->next;}else /*否则从表头查找相应的位置序号i*/{while(j<i-1&&q->next!=null){q=q->next;j++;}if(q->next!=null&&j==i-1) /*如果找到位置i,则将该位置的结点删除*/{q->next=t->next;}else /*否则位置i不存在*/printf("位置参数不正确!\n");}if(t!=null)free(t);}void display(Lnode *p) /*将指针p指向的基本线性表输出*/{Lnode *q;q=p;printf("单链表显示: ");if(q==null)printf("链表为空!");else if (q->next==null) /*如果基本线性表只有单个结点,则将其数据域输出*/printf("%d\n",q->data);else /*否则,逐个输出所有结点的数据域*/{while(q->next!=null){printf("%d->",q->data);q=q->next;}printf("%d",q->data);}printf("\n");}main(){Lnode *q;int d,i,n,select,k,flag=1;clrscr();head=null;printf("请输入数据长度: ");scanf("%d",&n);for(i=1;i<=n;i++){printf("将数据插入到单链表中: ");scanf("%d",&d);insert(d,i);}display(head);printf("\n");while(flag){printf("1-- 求长度 \n");printf("2-- 取结点 \n");printf("3-- 求值查找 \n");printf("4-- 增加结点 \n");printf("5-- 删除结点 \n");printf("6-- 退出 \n");printf("input your select: ");scanf("%d",&select);switch(select){case 1:{d=length(head);printf("\n单链表的长度为:%d ",d);printf("\n");display(head);printf("\n");}break;case 2:{ printf("\n请输入取得结点的位置: ");scanf("%d",&d);k=get(head,d);printf("%d\n",k);display(head);printf("\n");}break;case 3:{ printf("\n请输入要查找的数据: ");scanf("%d",&d);k=locate(head,d);printf("%d\n",k);display(head);printf("\n");}break;case 4:{ printf("\n请输入增加结点的位置:");scanf("%d",&k);printf("\n请输入增加结点的数据:");scanf("%d",&d);insert(d,k);display(head);printf("\n");}break;case 5:{ printf("\n请输入删除结点的位置: ");scanf("%d",&d);delete(head,d);printf("\n");display(head);printf("\n");}break;case 6: flag=0;break;}}}2.2 基本线性表的就地逆置【算法实现】(1)顺序结构基本线性表的就地逆置算法实现。