北京理工大学《数据结构与算法设计》实验报告实验四
数据结构与算法分析实验报告
数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
数据结构与算法 图的结构和操作实验报告
《数据结构与算法分析》课程实验报告【实验目的】1. 理解图形结构的逻辑和存储特点。
2. 掌握图形结构遍历递归算法。
【实验内容】1. 用邻接矩阵或者邻接表存储一个图形结构。
2. 采用深度或者广度优先搜索算法,遍历一个图,并输出遍历结果。
【实验方式】个人实验。
【实验设备与环境】PC机,Windows XP操作系统,VC++6.0开发环境。
【数据结构及函数定义】(1)类的定义:类的数据成员,成员函数...................(2)主函数main()实现初始化操作,完成对子函数的调用...................(3)子函数...................。
【测试数据与实验结果】(请用截图的方式展示实验结果,并辅以必要的文字说明)【源程序清单】(请附上源程序)#include<iostream>using namespace std;#include<string.h>class Graph{public:c har Vtx[20];d ouble AdjMtx[20][20];i nt CurrentVnum;i nt CurrentEnum;G raph(){CurrentVnum=CurrentEnum=0;} i nt first_adj(int v);i nt next_adj(int v1,int v2);v oid visite(int v);v oid DFS();v oid DFS(int v,int visited[]);~Graph(){}};int Graph::first_adj(int v){f or(int v1=0;v1<CurrentVnum;v1++)if(AdjMtx[v][v1]>0)return v1;return -1;}int Graph::next_adj(int v1,int v2) {f or(int vn=v2+1;vn<CurrentVnum;vn++)if(AdjMtx[v1][vn]>0)return vn;return -1;}void Graph::visite(int v){c out<<Vtx[v]<<" ";}void Graph::DFS(){i nt *visited=new int[CurrentVnum];f or(int i=0;i<CurrentVnum;i++)visited[i]=0;f or(i=0;i<CurrentVnum;i++){if(visited[i]==0)DFS(i,visited);}d elete[] visited;}void Graph::DFS(int v,int visited[]) {v isite(v);v isited[v]=1;i nt w=first_adj(v);w hile(w!=-1){if(!visited[w])DFS(w,visited);w=next_adj(v,w);}}int LocateVex(Graph G,char u){i nt i;f or(i=0;i<G.CurrentVnum;i++)if(u==G.Vtx[i])return i;return -1;}void creat(Graph &G){i nt i,j,k;c har va,vb;c out<<"请输入图的顶点数,弧数:";c in>>G.CurrentVnum>>G.CurrentEnum;c out<<"请输入"<<G.CurrentVnum<<"个顶点的值:";f or(i=0;i<G.CurrentVnum;i++)cin>>G.Vtx[i];f or(i=0;i<G.CurrentVnum;i++)for(j=0;j<G.CurrentVnum;j++)G.AdjMtx[i][j]=0;c out<<"请输入"<<G.CurrentEnum<<"条弧的弧尾,弧头(以空格作为间隔):\n";f or(k=0;k<G.CurrentEnum;k++){cin>>va>>vb;i=LocateVex(G,va);j=LocateVex(G,vb);if(i!=j){G.AdjMtx[i][j]=1;G.AdjMtx[j][i]=1;}else G.AdjMtx[i][j]=1;}}void main(){G raph G;c reat(G);c out<<"深度优先搜索序列:"<<endl;G.DFS();c out<<endl;。
《数据结构和算法设计》实验报告
《数据结构与算法设计》实验报告——实验二一、实验目的按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
二、实验内容简单计算器。
请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求:①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。
②输入表达式中的数值均为大于等于零的整数。
中间的计算过程如果出现小数也只取整。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计概要设计1、宏定义#define TRUE 1#define FALSE 0#define OK 1#define ERROR 02、基本函数:(1)void InitStack_char(SqStack *S) //char型栈初始化(2)void InitStack_int(sqStack *S) //int型栈初始化(3)void Push_char(SqStack *S,char ch) //char型元素进栈(4)void Push_int(sqStack *S,int num) //int型元素进栈(5)char GetTop_char(SqStack *S) //取char型栈顶元素(6)int GetTop_int(sqStack *S) //取int型栈顶元素(7)Status In(char c) //判断是否为运算符,若是运算符则返回,否则返回(8)char Precede(char a,char b) //判断两运算符的先后次序(9)Status Pop_char(SqStack *S,char &x) //char型栈出栈(10)Status Pop_int(sqStack *S,int &x) //int型栈出栈(11)int Operate(int a,char theta,int b) //计算a和b运算结果3、流程图详细设计数据类型typedef struct node //构造char型栈{char ch;struct node *next;}node;typedef struct{struct node *base;struct node *top;}SqStack;typedef struct lnode //构造int型栈{int num;struct lnode *next;}lnode;typedef struct{struct lnode *base;struct lnode *top;}sqStack;操作部分void InitStack_char(SqStack *S){S->base = (node *)malloc(sizeof(node));S->base->next=NULL;S->top = S->base;} //char型栈初始化void InitStack_int(sqStack *S){S->base = (lnode *)malloc(sizeof(lnode));S->base->next=NULL;S->top = S->base;} //int型栈初始化void Push_char(SqStack *S,char ch){node *p;p=(node*)malloc(sizeof(node));p->ch=ch;p->next=S->top;S->top=p;} //char型元素进栈Status Push_int(sqStack *S,int num){lnode *p;p=(lnode*)malloc(sizeof(lnode));p->num=num;p->next=S->top;S->top=p;return OK;} //int型元素进栈char GetTop_char(SqStack *S){return (S->top->ch);} //取char型栈顶元素int GetTop_int(sqStack *S){return (S->top->num);} //取int型栈顶元素Status Pop_char(SqStack *S,char &x){if(S->base == S->top)return ERROR;node *p;p=S->top;x=p->ch;S->top=p->next;free(p);return OK;} //char型栈出栈Status Pop_int(sqStack *S,int &x){if(S->base == S->top)return ERROR;lnode *p;p=S->top;x=p->num;S->top=p->next;free(p);return OK;} //int型栈出栈计算功能int Operate(int a,char theta,int b){int i,z = 1;switch(theta){case '+':z = (a + b);break;case '-':z = (a - b);break;case '*':z = (a * b);break;case '/':z = (a / b);break;case '^':for(i = 1;i<=b;i++)z = z*a;break;}return (z);} //计算a和b运算结果Status In(char c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='='||c=='^') return OK;elsereturn ERROR;} //判断是否为运算符char Precede(char a,char b){if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='=')return '>';elsereturn '<';}if(a=='*'||a=='/'){if(b=='('||b=='^')return '<';elsereturn '>';}if(a=='('){if(b==')')return '=';elsereturn '<';}if(a==')'){if(b!='(')return '>';}if(a=='#'){if(b=='=')return '=';elsereturn '<';}if(a=='^')return ('>');} //判断两运算符的先后次序主函数int main() //主函数{char c,x,theta;int a,b,c1; //定义变量SqStack OPTR; //定义字符栈sqStack OPNR; //定义整型栈InitStack_char(&OPTR); //初始化InitStack_int(&OPNR); //初始化Push_char(&OPTR,'#'); //将字符型栈底设为#c = getchar(); //从键盘输入得到字符while(c!='='||GetTop_char(&OPTR)!='#') //判定是否执行循环if(!In(c)){c1 = 0;while(!In(c)){c1 = c1*10+c-'0';c = getchar();}Push_int(&OPNR,c1);} //当扫描字符不是运算符时,转化为整型数存入栈中else{switch(Precede(GetTop_char(&OPTR),c)) //判定运算符的优先关系{case '<':Push_char(&OPTR,c);c = getchar();break; //当前运算符优先级高,存入char栈case '=':Pop_char(&OPTR,c);c = getchar();break; //运算符次序相等,存入char栈case '>': //当前运算符优先级低Pop_char(&OPTR,theta);Pop_int(&OPNR,b);Pop_int(&OPNR,a);Push_int(&OPNR, Operate(a,theta,b));//计算运算结果,并存入int栈break; //继续循环}}printf("%d\n",GetTop_int(&OPNR)); //计算完成,取出int栈顶元素,并输出return 0;}四、程序调试分析编写程序的过程中遇到了很多的问题,最突出的两个问题就是整数和两位数的运算处理,一开始修改了主函数部分之后,原来可以执行一位数运算的程序出现了error,由于没有及时保存,并且之前的代码无法恢复,只得重新编写一次。
数据结构与算法实验报告
数据结构实验报告题目:线性表班级:网络工程1401班学号: 1408020106指导教师:高峰日期: 2016/7/6实验一:线性表一:实验要求掌握数据结构中线性表的基本概念。
熟练掌握线性表的基本操作:创建、插入、删除、查找、输出、求长度及合并并运算在顺序存储结构撒谎能够的实验。
熟练掌握链表的各种操作和应用。
二.实验内容1. 编程实现在顺序存储的有序表中插入一个元素(数据类型为整型)。
2. 编程实现把顺序表中从i个元素开始的k个元素删除(数据类型为整型)。
三:实验过程及步骤源代码:#include<stdio.h>#include<malloc.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{int * elem;int length;int listsize;}SqList;//SqList sq;void InitList_Sq(SqList *sq) //初始化列表{sq->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));sq->length=0;sq->listsize=LIST_INIT_SIZE;printf("---申请空间成功---!\n");}void GetElem(SqList *sq,int i)//获取第i位置元素的值{int *p;p=&(sq->elem[i-1]);printf("%d",*p);printf("\n");}int ListInsert_Sq(SqList *sq,int i,int a)//在i位置之前插入a{int *p,*q;if(i<=0||i>sq->length+1){printf("---位置不合法---!\n");return 0;}if(sq->length>=sq->listsize){int* newbase=(int *)realloc(sq->elem,(sq->listsize+LISTINCREMENT)*sizeof(int)); if(!newbase){printf("申请空间溢出\n");return 0;}sq->elem=newbase;sq->listsize+=LISTINCREMENT;}p=&(sq->elem[i-1]);//p指向第i位置的元素q=&(sq->elem[sq->length-1]);//q指向最后一个元素for(;q>=p;--q) *(q+1)=*q;*p=a;++sq->length;return 1;}int ListDelete_Sq(SqList *sq,int i) //删除i位置上的值{int *p,*q;if(i<1||i>sq->length) return 0;p=&(sq->elem[i-1]);//p指向第i位置的元素q=sq->elem+sq->length-1;//q指向最后一个元素for(++p;p<=q;++p){*(p-1)=*p;}--sq->length;return 1;}void visit(SqList *sq)//输出数据{int i=1;for(;i<=sq->length;i++){int *p;p=&sq->elem[i-1];printf("%d",*p);printf(" ");}}void main(){int i=1,a=0,boo=1,number=0;SqList s,*sq;sq=&s;InitList_Sq(sq);printf("初始化空表\n");printf("输入数据个数:\n");scanf("%d",&number);printf("输入%d个数据:",number);printf("\n");for(;i<=number;i++){scanf("%d",&a);if(boo=ListInsert_Sq(sq,i,a)){printf("---插入成功!---\n");}else{printf("---插入不成功,重新插入---!\n"); i=i-1;}}printf("输出所有元素\n");visit(sq);printf("\n");printf("输出删除的位置:");scanf("%d",&a);if(boo=ListDelete_Sq(sq,a)){printf("---数据删除成功!---\n");}else{printf("---没有删除成功---\n");}printf("输出所有元素:\n");visit(sq);printf("\n");printf("输出要显示数据的位置:");scanf("%d",&a);printf("输出%d位置数值\n",a);if(a<0||a>sq->length){printf("---输出位置的数据不存在---\n");}else{GetElem(sq,a);}}步骤:1.初始化空表2.顺序插入数据后输出所有元素3.选择删除位置,删除数据后输出所有元素4.选择查看的数据位置,输出选择查看的数据四:实验结果及分析分析:本程序在实现顺序存储插入以及删除i个元素开始的k个元素删除(数据类型为整型)。
数据结构与算法实验报告
《数据结构与算法》综合实验报告系别:专业:学生姓名:指导教师:2011年 11月 25日实验目的掌握线性表的建立、插入、删除算法;掌握查找算法;掌握排序算法;实验要求使用C语言(环境任意)开发程序,能够对用户输入的任意一组数据,建立一个线性表,可以输出此线性表。
并且能够对此线性表进行插入、删除、查找、排序等操作。
程序流程建表如下:定义一个整型的数据类型data和next指针:定义头指针和当前结点指针,申请连续空间将单个字节大小复制给头指针,把头指针赋值给当前节点指针:若输入的数是0,则若输入不为0,把输入的数赋值给已申请的新结点,把新结点赋给当前节点的next域,再把新结点赋值给当前结点,以此方法重复执行得到如下链表:输出函数:把头指针赋值给当前结点指针,当当前节点的next域不为空时输出当前节点所指向的数据,把当前结点的next域赋值给当前节点,否则输出链表为空对此线性表进行插入、删除、查询、排序操作把已申请的结点数据域指向所输入的数再把插入w结点赋值头结点,是插入的位置,如果w=0则插入结点的next域赋值给头结点否则如果w>表长,则输出超出范围代码及运行结果(主要语句要求有注释)#include"stdafx.h"#include<stdio.h>#include<malloc.h>#define NULL 0typedef struct linknode{int data;struct linknode *next;}node;node *head;node *creat(){node *currnode,*newnode;int x;head=(node*)malloc(sizeof(node));currnode=head;do{scanf("%d",&x);newnode=(node*)malloc(sizeof(node));newnode->data=x;currnode->next=newnode;currnode=newnode;}while(x!=NULL);head=head->next;currnode->next=NULL;return head;};int length(){node *currnode;int i=0;currnode=head;while(currnode->data!=NULL){currnode=currnode->next;i++;};return i;};void print(){node *currnode;currnode=head;printf("链表如下....linklist");while(currnode->data!=NULL){printf("%d-->",currnode->data);currnode=currnode->next;};printf("NULL\n");printf("链表长度为........linklist length%d\n",length());};void delete1(){int x;node *delnode,*currnode;printf("输入要删除的数据......input delete data:");scanf("%d",&x);if(head->data==NULL) printf("此链表为空无法删除.....this linklist empty!\n"); if(head->data==x){delnode=head;head=head->next;free(delnode);if(head==NULL) printf("此链表为空.......this linklist enpty!");}else{currnode=head;delnode=currnode->next;while(delnode->data!=x&&delnode!=NULL){currnode=currnode->next;delnode=currnode->next;};if(delnode==NULL)printf("无此数据......no this data!\n");else{currnode->next=delnode->next;free(delnode);};};};void find(){node *currnode;int count=1,x;currnode=head;printf("输入要查找的数据.......input search data:");scanf("%d",&x);while(currnode->data!=NULL&&currnode->data!=x) {currnode=currnode->next;count++;};if(currnode->data!=NULL){printf("\n%d为第........is no.",currnode->data);printf("%d个数据........data。
算法与数据结构实验报告
2015-2016学年第二学期《算法与数据结构》课程实验报告专业软件工程学生姓名成晓伟班级软件141学号1410075094实验学时16实验教师徐秀芳信息工程学院实验一单链表的基本操作一、实验目的1.熟悉C语言上机环境,进一步掌握C语言的基本结构及特点。
2.掌握线性表的各种物理存储表示和C语言实现。
3.掌握单链表的各种主要操作的C语言实现。
4.通过实验理解线性表中的单链表存储表示与实现。
二、主要仪器及耗材普通计算机三、实验内容与要求1、用C语言编写一个单链表基本操作测试程序。
(1)初始化单链表(2)创建单链表(3)求单链表长度(4)输出单链表中每一个结点元素(5)指定位置插入某个元素(6)查找第i个结点元素的值(7)查找值为e 的结点,并返回该结点指针(8)删除第i个结点(9)销毁单链表2、实验要求(1)程序中用户可以选择上述基本操作。
程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。
(2)要求用线性表的顺序存储结构,带头结点的单链表存储结构分别实现。
(3)主函数实现对基本操作功能的调用。
3、主要代码(1)初始化单链表LinkList *InitList(){ //创建一个空链表,初始化线性表LinkList *L;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;return L;}(2)创建单链表//头插法void CreateListF(LinkList *L){LinkList *s;int i=1,a=0;while(1){printf("输入第%d个元素(0表示终止)",i++);scanf("%d",&a);if(a==0)break;s=(LinkList *)malloc(sizeof(LinkList));s->data=a;s->next=L->next;L->next=s;}}(3)求链表长度int ListLength(LinkList *L){ //求链表长度int n=0;LinkList *p=L;while(p->next!=NULL){p=p->next;n++;}return(n);}(4)在指定位置插入元素int InsertList(LinkList *L,int i,ElemType e){LinkList *p=L,*s;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找出要插入的位置的前一个位置if(p==NULL){return 0;}else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}(5)输出链表void DispList(LinkList *L){ //输出链表LinkList *p=L->next;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}(6)查找链表中指定元素int GetElem(LinkList *L,int i){ //查找链表中指定元素LinkList *p=L;int j=0;while(j<i&&p!=NULL){j++;p=p->next;}if(p==NULL){return 0;}else{return p->data;}}(7)查找值是e的结点并返回该指针LinkList *LocateElem(LinkList *L,ElemType e){ //查找值是e的结点并返回该指针int i=1;LinkList *p=L;while(p!=NULL)if(p->data==e) return p;}if(p==NULL){return NULL;}}(8)删除元素int ListDelete(LinkList *L,int i,ElemType *e){ //删除元素LinkList *p=L,*q;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找到要删除元素地址的前一个地址if(p==NULL){ return 0;} //不能删除else{q=p->next;*e=q->data;p->next=q->next;free(q); //删除成功return 1;}}(9)销毁链表void DestroyList(LinkList *L){//销毁链表LinkList *pre=L,*p=L->next;while(p!=NULL){free(pre);pre=p;p=pre->next;}free(pre);}main函数:int main(){LinkList *L;ElemType e;int i;L=InitList();CreateListF(L);DispList(L);printf("输入要查找的元素位置:\n");scanf("%d",&i);e=GetElem(L,i);printf("%d\n",e);printf("单链表长度为:%d\n",ListLength(L));printf("输入要删除元素的位置:");scanf("%d",&i);if (i>ListLength(L)){printf("超出范围重新输入");scanf("%d",&i);}if(ListDelete(L,i,&e)==0){printf("未找到元素\n");}else DispList(L);printf("输入插入元素的位置和值:");scanf("%d%d",&i,&e);InsertList(L,i,e);DispList(L);return 0;}4、测试数据及测试结果输入:23 56 12 28 45输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。
算法与及数据结构实验报告
算法与及数据结构实验报告算法与数据结构实验报告一、实验目的本次算法与数据结构实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见算法和数据结构的基本原理、特性和应用,提高我们解决实际问题的能力和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,为了进行算法性能的分析和比较,使用了 Python 的 time 模块来计算程序的运行时间。
三、实验内容1、线性表的实现与操作顺序表的实现:使用数组来实现顺序表,并实现了插入、删除、查找等基本操作。
链表的实现:通过创建节点类来实现链表,包括单向链表和双向链表,并完成了相应的操作。
2、栈和队列的应用栈的实现与应用:用数组或链表实现栈结构,解决了表达式求值、括号匹配等问题。
队列的实现与应用:实现了顺序队列和循环队列,用于模拟排队系统等场景。
3、树结构的探索二叉树的创建与遍历:实现了二叉树的先序、中序和后序遍历算法,并对其时间复杂度进行了分析。
二叉搜索树的操作:构建二叉搜索树,实现了插入、删除、查找等操作。
4、图的表示与遍历邻接矩阵和邻接表表示图:分别用邻接矩阵和邻接表来存储图的结构,并对两种表示方法的优缺点进行了比较。
图的深度优先遍历和广度优先遍历:实现了两种遍历算法,并应用于解决路径查找等问题。
5、排序算法的比较插入排序、冒泡排序、选择排序:实现了这三种简单排序算法,并对不同规模的数据进行排序,比较它们的性能。
快速排序、归并排序:深入理解并实现了这两种高效的排序算法,通过实验分析其在不同情况下的表现。
6、查找算法的实践顺序查找、二分查找:实现了这两种基本的查找算法,并比较它们在有序和无序数据中的查找效率。
四、实验步骤及结果分析1、线性表的实现与操作顺序表:在实现顺序表的插入操作时,如果插入位置在表的末尾或中间,需要移动后续元素以腾出空间。
删除操作同理,需要移动被删除元素后面的元素。
在查找操作中,通过遍历数组即可完成。
大学数据结构与算法基础实验报告书(参考)
《数据结构与算法》实验报告班级:学生学号:学生姓名:学生电话:指导教师:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:1. 按时完成实验;2. 实验内容和过程记录完整;3.问题解答完整、正确;4.有实验的心得或讨论;5.实验报告的撰写认真、格式符合要求,没有抄袭行为。
教师签名:。
数据结构查找算法实验报告
数据结构实验报告实验第四章:实验:简单查找算法一.需求与规格说明:查找算法这里主要使用了顺序查找,折半查找,二叉排序树查找与哈希表查找四种方法。
由于自己能力有限,本想实现其她算法,但没有实现.其中顺序查找相对比较简单,折半查找参考了书上得算法,二叉排序树查找由于有之前做二叉树得经验,因此实现得较为顺利,哈希表感觉做得并不成功,感觉还就是应该可以进一步完善,应该说还有很大得改进余地。
二.设计思想:开始得时候提示输入一组数据。
并存入一维数组中,接下来调用一系列查找算法对其进行处理。
顺序查找只就是从头到尾进行遍历。
二分查找则就是先对数据进行排序,然后利用三个标志,分别指向最大,中间与最小数据,接下来根据待查找数据与中间数据得比较不断移动标志,直至找到。
二叉排序树则就是先构造,构造部分花费最多得精力,比根节点数据大得结点放入根节点得右子树,比根节点数据小得放入根节点得左子树,其实完全可以利用递归实现,这里使用得循环来实现得,感觉这里可以尝试用递归.当二叉树建好后,中序遍历序列即为由小到大得有序序列,查找次数不会超过二叉树得深度。
这里还使用了广义表输出二叉树,以使得更直观。
哈希表则就是利用给定得函数式建立索引,方便查找.三.设计表示:四.实现注释:其实查找排序这部分与前面得一些知识联系得比较紧密,例如顺序表得建立与实现,顺序表节点得排序,二叉树得生成与遍历,这里主要就是中序遍历.应该说有些知识点较为熟悉,但在实现得时候并不就是那么顺利。
在查找到数据得时候要想办法输出查找过程得相关信息,并统计。
这里顺序查找与折半查找均使用了数组存储得顺序表,而二叉树则就是采用了链表存储得树形结构。
为了直观起见,在用户输入了数据后,分别输出已经生成得数组与树。
折半查找由于只能查找有序表,因此在查找前先调用函数对数据进行了排序。
在查找后对查找数据进行了统计.二叉排序树应该说由于有了之前二叉树得基础,并没有费太大力气,主要就是在构造二叉树得时候,要对新加入得节点数据与跟数据进行比较,如果比根节点数据大则放在右子树里,如果比根节点数据小则放入左子树。
北理工数据结构实验 排序
本科实验报告实验名称:排序一、实验目的2、通过编程、上机调试,进一步理解排序的方法。
3、具体尝试插入排序、快速排序、选择排序的操作步骤。
4、锻炼动手编程,独立思考的能力。
二、实验题目排序输入10个数,从插入排序、快速排序、选择排序三类算法中各选一种编程实现三、实验基础知识插入排序、快速排序、选择排序三类算法的基本思想四、实验设计方法1、概要设计(1)、插入排序(此次使用直接插入排序)void InsertionSort ( SqList &L ){ // 对顺序表L 作直接插入排序。
for ( i=2; i<=L.length; ++i )if (L.r[i].key < L.r[i-1].key){L.r[0] = L.r[i]; // 复制为监视哨for ( j=i-1; L.r[0].key < L.r[j].key; -- j )L.r[j+1] = L.r[j]; // 记录后移L.r[j+1] = L.r[0]; // 插入到正确位置}} // InsertSort(2)、快速排序(此次用的是起泡排序)V oid Bubblesort(elem R[],int n){I=n;While(i>1){lastExchangeIndex = 1;for(j=1;j<i;j++)if(R[j+1].key<R[j].key){swap(R[j],R[j+1]);lastExchangeIndex =j; //记下进行交换的记录位置}I=lastExchangeIndex ; //本趟进行过交换的最后一个记录的位置}//Bubblesort(3)、选择排序V oid selectsort(elem r[],int n){//对记录序列r[1..n]作简单选择排序。
for(i=1;i<n;++i){//选择第i小的记录,并交换到位j=selectminkey(r,i);//zai r[i..n]中选择关键字最小的记录if(i!=j) R[i] R[j];//与第i个记录交换}}//selectsort五、实验结果及数据分析数据为3 2 4 1 5 0 6 9 8 7的十个数的三种排序方法1、插入排序2、快速排序3、选择排序六、总结此次编程实验,较前几次而言稍微简单一点,并且以前用过起泡排序法,所以对排序方面比较熟悉,但是也遇到了一些问题,例如数组下标问题没处理好,让我在编程实践中花费了大量时间检查。
北京理工大学数据结构实验报告选作1
《数据结构与算法统计》实验报告学院:班级:学号:姓名:一、实验目的1.熟悉VC++6.0环境,学习使用C++实现链表的存储结构;2.通过编程,上机调试,进一步理解线性表、链表的基本概念。
二、实验内容归并顺序表(选作)。
请按以下要求编程实现:①从键盘输入两个升序排列的整数序列linka和linkb,每个序列以输入0为结束标记。
②将链表linka和linkb归并为linkc,linkc仍然为升序排列。
归并完成后,linka和linkb为空表。
输出linkc。
③对linkc进行处理,保持升序不变,删除其中重复的整数,对重复的整数只保留一个,输出删除重复整数后的链表。
例如:linka输入为:10 20 30 40 50 0linkb输入为:15 20 25 30 35 40 45 50 0归并后的linkc为:10 15 20 20 25 30 30 35 40 40 45 50 50删除重复后的linkc为:10 15 20 25 30 35 40 45 50三、程序设计1、概要设计说明程序的主要功能,主程序的流程以及各个程序模块之间的调用关系,给出主要流程图。
应用单链线性表寄存数字序列。
⑴单链线性表的抽象数据类型线性表的定义如下:ADT LinkList {数据对象:D = { ai | ai ∈ElemSet, i=1,…,n,n≥0 }数据关系:R1 = { <ai-1, ai> | ai-1,ai ∈D, i=2, …,n }基本操作:Creat(LinkList &L)操作结果:构造单链线性表L。
MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)初始条件:单链线性表La,Lb,Lc已经存在。
操作结果:归并La,Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
Delete(LinkList &L)初始条件:链表L已经存在。
《算法与数据结构》实验报告(新)
《算法与数据结构》实验报告学院专业姓名学号每个实验报告的程序名为班级号_学号_姓名_题号.c++(多文件压缩为rar)实验1:ADT List(线性表)(3学时)[问题描述]线性表是典型的线性结构,实现ADT List,并在此基础上实现两个集合的交运算或并运算。
[实验目的](1)掌握线性表的两种存储结构,即顺序表和链表。
(2)掌握在顺序表和单链表上基本操作的实现。
(3)在掌握顺序表和单链表的基本操作上进行综合题的实现。
[实验内容及要求](1)集合的元素限定为十进制数。
(2)任意输入两个集合的元素。
(3)显示两个集合的内容及其运算结果。
[测试数据](1)set1={3, 5, 8, 11},set2={2, 6, 8, 9, 11, 15, 20}set1∪set2=?set1∩set2=?(2)set1={9, 3, 14, 6},set2={1, 30, 3, 7, 14, 25, 6, 3, 19, 9}set1∪set2=?set1∩set2=?[思考](1)算法的复杂度是多少?(2)线性表可以用顺序表或单链表实现,你采用的是哪一种?为什么?(3)若把实验要求(2)更改为两个集合内的元素是递增的,请你提出一种时间复杂度更少的算法,并说明时间复杂度是多少?《算法与数据结构》实验报告学院专业姓名学号每个实验报告的程序名为班级号_学号_姓名_题号.c++(多文件压缩为rar)实验2:串的基本操作的实现(3学时)[问题描述]串是数据类型为字符的特殊的线性表,在串的基本操作中,通常以“串的整体”作为操作对象。
所以串的基本操作和线性表有很大差别。
本实验是实现串的一些基本操作。
[实验目的](1)熟悉串的基本操作的含义。
(2)掌握串的数组存储以及在其上实现串操作的基本方法。
(3)掌握重载操作的设计和实现方法。
[实验内容及要求](1)不允许使用C++语言本身提供的串函数。
(2)利用数组存储实现串的基本操作:即赋值、求长度、连接、求子串、子串定位、替换、退出等操作。
北京理工大学-数据结构实验报告-实验四--图书管理系统
实验四图书管理系统姓名:任子龙学号:1120140167 班级:05111451一。
需求分析(1)问题描述有一个小型书库保管了大量图书,关于图书有大量信息需要处理,这些信息包括图书的分类、书名、作者名、购买日期、价格等。
现要求编写一个程序以便于对图书的管理。
(2)基本要求:a.建立图书信息.b.提供查找功能,按照多种关键字查找需要的书籍。
例如按书名查找,输入书名后,将显示出该图书的所有信息,或显示指定信息。
c.提供排序功能,按照多种关键字对所有的书籍进行排序,例如按出版日期进行排序。
d.提供维护功能,可以对图书信息进行添加、修改、删除等功能。
(3)数据结构与算法分析将每一本书看作是一个基本单元。
由于涉及添加、修改操作,这里使用了链表作为数据存储结构;同时,考虑到排序功能,尝试使用双向链表。
其中,每本书作为一个结点,数据域包含char 型变量,指针域含有左右指针left和right。
二.概要设计1。
抽象数据类型的定义为实现上述功能,程序中使用了双向链表,只需要定义一种数据类型:typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;注意结点的指针域有left和right两个。
2.本程序包含两个模块(1)主程序模块主函数只包含了Menu_select()函数。
目的是进入主菜单界面,进行功能选择;直到输入操作码0,退出系统;(2)双向链表单元模块——实现书籍信息的链式存储的抽象数据类型.各函数之间的调用关系:三。
详细设计1。
结点类型typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;2.子函数(1)功能菜单调用函数Menu_select()使用户进入主菜单界面,进行功能选择;先进入无限循环,输入操作码进行系统管理工作,直到输入操作码0,退出系统;(2)各种功能函数Initialize()//初始化图书系统信息;Insert()//添加新的图书信息;Sort()//对图书进行排序,本程序可以实现按“图书编号”、“出版日期"、“图书价格”多种关键字进行排序;Search()//实现对图书的查找功能,本程序可以实现按“图书编号"、“出版日期”、“图书价格”多种关键字进行查找;deletebook()//删除无效的图书信息;Print_book()//打印全部图书信息。
北京理工大学《数据结构与算法设计》实验报告实验四
《数据结构与算法设计》实验报告——实验四学院:班级:学号:姓名:一、实验目的1.通过实验实践、巩固线性表的相关操作; 2.熟悉VC 环境,加强编程、调试的练习; 3.用C 语言实现线性表的抽象数据类型,实现线性表构造、插入、取数据等基本操作; 4. 理论知识与实际问题相结合,利用上述基本操作实现三种排序并输出。
二、实验内容从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。
三、程序设计1、概要设计为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。
(1)抽象数据类型:ADT SqList{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,1,2,,}i ii i a a a a D i n --<>∈= 基本操作:InPut(SqList &L)操作结果:构造一个线性表L 。
OutPut(SqList L)初始条件:线性表L 已存在。
操作结果:按顺序在屏幕上输出L 的数据元素。
InsertSort(SqList &L)初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行插入排序。
QuickSort(SqList &L)初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行快速排序。
SelectSort(SqList &L)初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行选择排序。
}ADT SqList⑵主程序流程由主程序首先调用InPut(L)函数创建顺序表,调用InsertSort(L)函数进行插入排序,调用OutPut(L)函数显示排序结果。
调用QuickSort(L)函数进行交换排序,调用OutPut(L)函数显示排序结果。
调用SelectSort(L)函数进行选择排序,调用OutPut(L)函数显示排序结果。
院校资料-北理工数据结构实验报告
北理工数据结构实验报告《数据结构与算法设计》实验报告——实验二学院:自动化学院班级:____学号:__姓名:_____一、实验目的1、熟悉VC 环境,学习使用C 语言实现栈的存储结构。
2、通过编程、上机调试,进一步理解栈的基本概念。
3、锻炼动手编程,独立思考的能力。
二、实验内容实现简单计算器的功能,请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求支持运算符:+、-、*、/、%、()和=:① 从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志;② 输入表达式中的数值均为大于等于零的整数,如果中间计算过程中出现小数也只取整进行计算。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计1、概要设计为实现上述程序功能,应使用两个栈,分别寄存操作数与运算符。
为此,需要栈的抽象数据结构。
(1)、栈的抽象数据类型定义为:ADT Stack{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,2,,}i i i i a a a a D i n --∈=约定n a 端为栈顶,1a 端为栈底。
基本操作:InitStack(&S)操作结果:创建一个空栈S。
GetTop(S,&e)初始条件:栈S已存在且非空。
操作结果:用e返回S的栈顶元素。
Push(&S,e)初始条件:栈S已存在。
操作结果:插入元素e为新的栈顶元素。
Pop(&S,&e)初始条件:栈S已存在且非空。
操作结果:删除S的栈顶元素,并用e返回其值。
In(m,a[])操作结果:若m是运算符,返回TRUE。
Precede(m, n)初始条件:m,n为运算符。
操作结果:若m优先级大于n,返回>,反之亦然。
Operation(a, theta,b)初始条件:a,b为整数,theta为运算符。
《数据结构和算法设计》实验报告
《数据结构与算法设计》实验报告——实验二一、实验目的按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
二、实验内容简单计算器。
请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求:①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。
②输入表达式中的数值均为大于等于零的整数。
中间的计算过程如果出现小数也只取整。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计概要设计1、宏定义#define TRUE 1#define FALSE 0#define OK 1#define ERROR 02、基本函数:(1)void InitStack_char(SqStack *S) //char型栈初始化(2)void InitStack_int(sqStack *S) //int型栈初始化(3)void Push_char(SqStack *S,char ch) //char型元素进栈(4)void Push_int(sqStack *S,int num) //int型元素进栈(5)char GetTop_char(SqStack *S) //取char型栈顶元素(6)int GetTop_int(sqStack *S) //取int型栈顶元素(7)Status In(char c) //判断是否为运算符,若是运算符则返回,否则返回(8)char Precede(char a,char b) //判断两运算符的先后次序(9)Status Pop_char(SqStack *S,char &x) //char型栈出栈(10)Status Pop_int(sqStack *S,int &x) //int型栈出栈(11)int Operate(int a,char theta,int b) //计算a和b运算结果3、流程图详细设计数据类型typedef struct node //构造char型栈{char ch;struct node *next;}node;typedef struct{struct node *base;struct node *top;}SqStack;typedef struct lnode //构造int型栈{int num;struct lnode *next;}lnode;typedef struct{struct lnode *base;struct lnode *top;}sqStack;操作部分void InitStack_char(SqStack *S){S->base = (node *)malloc(sizeof(node));S->base->next=NULL;S->top = S->base;} //char型栈初始化void InitStack_int(sqStack *S){S->base = (lnode *)malloc(sizeof(lnode));S->base->next=NULL;S->top = S->base;} //int型栈初始化void Push_char(SqStack *S,char ch){node *p;p=(node*)malloc(sizeof(node));p->ch=ch;p->next=S->top;S->top=p;} //char型元素进栈Status Push_int(sqStack *S,int num){lnode *p;p=(lnode*)malloc(sizeof(lnode));p->num=num;p->next=S->top;S->top=p;return OK;} //int型元素进栈char GetTop_char(SqStack *S){return (S->top->ch);} //取char型栈顶元素int GetTop_int(sqStack *S){return (S->top->num);} //取int型栈顶元素Status Pop_char(SqStack *S,char &x){if(S->base == S->top)return ERROR;node *p;p=S->top;x=p->ch;S->top=p->next;free(p);return OK;} //char型栈出栈Status Pop_int(sqStack *S,int &x){if(S->base == S->top)return ERROR;lnode *p;p=S->top;x=p->num;S->top=p->next;free(p);return OK;} //int型栈出栈计算功能int Operate(int a,char theta,int b){int i,z = 1;switch(theta){case '+':z = (a + b);break;case '-':z = (a - b);break;case '*':z = (a * b);break;case '/':z = (a / b);break;case '^':for(i = 1;i<=b;i++)z = z*a;break;}return (z);} //计算a和b运算结果Status In(char c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='='||c=='^') return OK;elsereturn ERROR;} //判断是否为运算符char Precede(char a,char b){if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='=')return '>';elsereturn '<';}if(a=='*'||a=='/'){if(b=='('||b=='^')return '<';elsereturn '>';}if(a=='('){if(b==')')return '=';elsereturn '<';}if(a==')'){if(b!='(')return '>';}if(a=='#'){if(b=='=')return '=';elsereturn '<';}if(a=='^')return ('>');} //判断两运算符的先后次序主函数int main() //主函数{char c,x,theta;int a,b,c1; //定义变量SqStack OPTR; //定义字符栈sqStack OPNR; //定义整型栈InitStack_char(&OPTR); //初始化InitStack_int(&OPNR); //初始化Push_char(&OPTR,'#'); //将字符型栈底设为#c = getchar(); //从键盘输入得到字符while(c!='='||GetTop_char(&OPTR)!='#') //判定是否执行循环if(!In(c)){c1 = 0;while(!In(c)){c1 = c1*10+c-'0';c = getchar();}Push_int(&OPNR,c1);} //当扫描字符不是运算符时,转化为整型数存入栈中else{switch(Precede(GetTop_char(&OPTR),c)) //判定运算符的优先关系{case '<':Push_char(&OPTR,c);c = getchar();break; //当前运算符优先级高,存入char栈case '=':Pop_char(&OPTR,c);c = getchar();break; //运算符次序相等,存入char栈case '>': //当前运算符优先级低Pop_char(&OPTR,theta);Pop_int(&OPNR,b);Pop_int(&OPNR,a);Push_int(&OPNR, Operate(a,theta,b));//计算运算结果,并存入int栈break; //继续循环}}printf("%d\n",GetTop_int(&OPNR)); //计算完成,取出int栈顶元素,并输出return 0;}四、程序调试分析编写程序的过程中遇到了很多的问题,最突出的两个问题就是整数和两位数的运算处理,一开始修改了主函数部分之后,原来可以执行一位数运算的程序出现了error,由于没有及时保存,并且之前的代码无法恢复,只得重新编写一次。
数据结构实验报告五—四则运算表达式求值
问题描述:四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。
一、需求分析:1、本程序是利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值。
2、输入输出格式:输入格式:在字符界面上输入一个中缀表达式,回车表示结束。
请输入表达式:输入一个中缀表达式输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
逆波兰表达式为:输出逆波兰表达式运算结果为:输出运算后的结果3、测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+二、概要设计:抽象数据类型二叉树类BiTree算法的基本思想根据题目要求,利用栈计算,和二叉树存储,来计算表达式该算法的基本思想是:先利用栈进行计算,然后用二叉树进行存储,和实验三算法一样来计算逆波兰表达式的值程序的流程程序由三个模块组成:(1)输入模块:输入一个运算式(2)计算模块:利用栈进行表达式的计算,二叉树来存储。
(3 )输出模块:屏幕上显示出后缀表达式和运算结果。
三、详细设计物理数据类型程序含有两个类,其中栈不再赘述,另一个类为二叉树class BiTree 包含私有成员struct BiTreeNode,根节点BiTreeNode *T;索引index; int number_of_point 优先级比较函数 compare(char a,char b);生成树的函数void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end);判断数字函数bool IsNumber(char a);求值函数double Operate(BiTreeNode *T);还有显示后缀表达式的函数void display(BiTreeNode *T) ;而公有成员函数则是对私有函数的重载,为方便使用,因为函数中普遍使用了递归的算法。
数据结构与算法课内实验实验报告
(三)内容提要:
1、数据采集
本次实验,每位同学对自己采集到的数据进行处理。数据采集的要求如下:
1)采集时间:(1)11.15~11.16(数据结构专题实验第4次实验);
(2)11.24(第11周周末);
(3)第5次数据结构专题实验时间;
2)对于每段移动,计算平均速度在m个样本上的速度平均值,16段移动可以得到16个速度平均值,对这16个速度平均值进行排序,给出最大和最小速度对应的段ID和平均速度。
3)对于每段移动,计算移动持续时间在m个样本上的移动持续时间平均值,16段移动可以得到16个移动持续时间平均值,对这16个移动持续时间平均值进行排序,给出最长和最短移动持续时间对应的段ID和移动持续时间。
Record record[16]; //文件中的十六段记录
}Sample;
typedef struct Data //读取原始数据时的中间存储结构
{
int x; //x坐标
int y; //y坐标
int time; //时间戳
int type; //操作类型
}Data;
typedef struct Result //统计结果的存储结构
(4)课内实验验收时间待定
2)采集地点:西一楼307;
3)采集时长:每位同学5~10分钟;
4)采集内容:每位同学认真完成指定的鼠标操作,包括鼠标的移动、鼠标单击和鼠标双击(见下述提示1)。
2、数据处理
采集到的数据会以文本的形式保存,一个文本文件称为一个样本。每位同学需要m个样本完成实验。读取文本文件并对数据进行如下操作:
2、文件的基本操作。文件的打开及读取数据,写入数据等。
数据结构与算法实验报告册
河南工程学院理学院学院实验报告(数据结构与算法)学期:课程:专业:班级:学号:姓名:指导教师:目录实验一线性表1 ................. 错误!未定义书签。
实验二线性表2 ................. 错误!未定义书签。
实验三栈和队列的应用........... 错误!未定义书签。
实验四赫夫曼编码............... 错误!未定义书签。
实验二线性表2(循环链表实现约瑟夫环)错误!未定义书签。
实验一线性表1 ................. 错误!未定义书签。
实验二线性表2 ................. 错误!未定义书签。
实验三栈和队列的应用........... 错误!未定义书签。
实验四赫夫曼编码............... 错误!未定义书签。
实验四赫夫曼编码实验一线性表1 ................. 错误!未定义书签。
实验二线性表2 ................. 错误!未定义书签。
实验三栈和队列的应用........... 错误!未定义书签。
实验四赫夫曼编码............... 错误!未定义书签。
实验六排序算法实验一线性表1一、实验学时: 2学时二、实验目的1.了解线性表的逻辑结构特性是数据元素之间存在着线性关系。
在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。
2.熟练掌握这两类存储结构的描述方法以及线性表的基本操作在这两种存储结构上的实现。
三、实验内容1. 编写程序,实现顺序表的合并。
2. 编写程序,实现单链表的合并。
四、主要仪器设备及耗材硬件:计算机一台软件:VC++ ,MSDN2003或者以上版本五、算法设计1. 顺序表合并的基本思想程序流程图:2. 单链表合并的基本思想程序流程图六、程序清单七、实现结果八、实验体会或对改进实验的建议实验二线性表2一、实验学时: 2学时二、实验目的1.了解双向循环链表的逻辑结构特性,理解与单链表的区别与联系。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法设计》
实验报告
——实验四
学院:
班级:
学号:
姓名:
一、实验目的
1.
通过实验实践、巩固线性表的相关操作; 2.
熟悉VC 环境,加强编程、调试的练习; 3.
用C 语言实现线性表的抽象数据类型,实现线性表构造、插入、取数据等基本操作; 4. 理论知识与实际问题相结合,利用上述基本操作实现三种排序并输出。
二、实验内容
从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。
三、程序设计
1、概要设计
为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。
(1)抽象数据类型:
ADT SqList{
数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥
数据关系:R1=11{,|,,1,2,,}i i
i i a a a a D i n --<>∈= 基本操作:
InPut(SqList &L)
操作结果:构造一个线性表L 。
OutPut(SqList L)
初始条件:线性表L 已存在。
操作结果:按顺序在屏幕上输出L 的数据元素。
InsertSort(SqList &L)
初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行插入排序。
QuickSort(SqList &L)
初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行快速排序。
SelectSort(SqList &L)
初始条件:线性表L 已存在。
操作结果:对L 的数据元素进行选择排序。
}ADT SqList
⑵主程序流程
由主程序首先调用InPut(L)函数创建顺序表,调用InsertSort(L)函数进行插入排序,
调用OutPut(L)函数显示排序结果。
调用QuickSort(L)函数进行交换排序,调用OutPut(L)
函数显示排序结果。
调用SelectSort(L)函数进行选择排序,调用OutPut(L)函数显示排序
结果。
⑶模块调用关系
由主函数模块调用创建顺序表模块,排序模块与显示输出模块。
⑷流程图
2、详细设计
(1)、宏定义
#define MAXSIZE 15//用作示例的小顺序表的最大长度(2)、抽象数据类型定义
typedef struct
{
int key;//关键字域
int otherinfo;//其它域
}RedType;//记录类型
typedef struct
{
RedType r[MAXSIZE+1];//r[0]闲置或用作哨兵单元int length;//顺序表长度
}SqList;//顺序表类型
(3)、操作算法程序实现:
void InPut(SqList &L)
{//输入数字,创建顺序表
int i;
printf("请输入10个数字:\n");
L.length=10;
for(i=1;i<=L.length;i++)
{
scanf("%d",&L.r[i].key);
}
}
void InsertSort(SqList &L)
{ //对顺序表L作直接插入排序(非递减)
int i,j;
for (i=2; i<=L. length; ++i)
if (L.r[i].key < L.r[i-1].key)
{ //将L.r[i]插入有序子表
L.r[0]=L.r[i]; //将L.r[i]复制为哨兵
for(j=i-1; L.r[0].key<L.r[j].key; --j ) L.r[j+1]=L.r[j]; //记录后移
L.r[j+1]=L.r[0]; //插入正确位置
}
}
int Partition(SqList &L,int low,int high)
{//交换顺序表L中子表r[low…high]的记录,枢轴记录到位,并返回其所在位置,
此时在它之前(后)的记录均不大(小)于它。
int pivotkey;
L.r[0].key=L.r[low].key;//用子表的第一个记录作枢轴记录
pivotkey=L.r[low].key;//枢轴记录关键字
while(low<high)//从表的两端交替地向中间扫描
{
while(low<high&&L.r[high].key>=pivotkey)
{
--high;//将比枢轴记录小的记录移到低端
}
L.r[low].key=L.r[high].key;
while(low<high&&L.r[low].key<=pivotkey)
{
++low;//将比枢轴记录大的记录移到高端
}
L.r[high].key=L.r[low].key;
}
L.r[low].key=L.r[0].key;//枢轴记录到位
return low;//返回枢轴位置
}
void QSort(SqList &L,int low,int high)
{//对顺序表L中的子序列L.r[low…high]作快速排序。