数据结构实验报告(2012级)
数据结构单链表插入、删除和修改实验报告
计算机学院实验报告课程名称:数据结构实验名称:单链表学生姓名:***学生学号:***********实验日期:2012一、实验目的1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。
2.掌握单链表中结点结构的C++描述。
3.熟练掌握单链表的插入、删除和查询算法的设计与C++实现。
二、实验内容1.编制一个演示单链表插入、删除、查找等操作的程序。
三、实验步骤1.需求分析本演示程序用C++6.0编写,完成单链表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。
①输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。
在所有输入中,元素的值都是整数。
②输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。
其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。
③程序所能达到的功能:完成单链表的生成(通过插入操作)、插入、删除、查找操作。
④测试数据:A.插入操作中依次输入11,12,13,14,15,16,生成一个单链表B.查找操作中依次输入12,15,22返回这3个元素在单链表中的位置C.删除操作中依次输入2,5,删除位于2和5的元素2.概要设计1)为了实现上述程序功能,需要定义单链表的抽象数据类型:(1)insert初始化状态:单链表可以不为空集;操作结果:插入一个空的单链表L。
(2)decelt操作结果:删除已有的单链表的某些结点。
(3)display操作结果:将上述输入的元素进行排列显示。
(4)modify操作结果:将上述输入的某些元素进行修改。
(5)save操作结果:对上述所有元素进行保存。
(6)load操作结果:对上述元素进行重新装载。
3.使用说明程序执行后显示======================1.单链表的创建2.单链表的显示3.单链表的长度4.取第i个位置的元素5.修改第i个位置的元素6.插入元素到单链表里7.删除单链表里的元素8.合并两个单链表9.退出系统=======================5.源代码:#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n){ LinkList p;L=new LNode;L->next=NULL;LinkList q=L;for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e){ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error;e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) { LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; }if(!p||j>i-1)return error;LinkList s=new LNode;s->data=e;s->next=p->next;p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e){ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){p=p->next;++j; }if(!(p->next)||j>i-1) return error;q=p->next;p->next=q->next;e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) {LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L){ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i){ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L){ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing(){ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<<endl;show(Lc);}void main(){ int select;int x;ElemType y;LinkList list;for(;;){ cout<<" 单链表的基本操作"<<endl;cout<<" 1.单链表的创建"<<endl;cout<<" 2.单链表的显示"<<endl;cout<<" 3.单链表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到单链表里"<<endl;cout<<" 7.删除单链表里的元素"<<endl;cout<<" 8.合并两个单链表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择所要取出元素的位置:";cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>x; }GetElem(list,x,y);cout<<"该位置的元素为:"<<y<<endl;break;case 5: xiugai(list); break;case 6: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 7: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 8: hebing();break;case 9: exit(0);break;default : cout<<"输入有误,请重新输入"<<endl;break;}}}6.测试结果四、实验总结(结果分析和体会)单链表的最后一个元素的next为null ,所以,一旦遍历到末尾结点就不能再重新开始;而循环链表的最后一个元素的next为第一个元素地址,可返回头结点进行重新遍历和查找。
算法与数据结构实验报告实验二
算法与数据结构实验报告实验二实验名称:线性表实现集合运算姓名:卢丽娟学号:211006289专业:软件工程班级:二班指导教师:陈亦萍日期: 2012年3月24日一、实验目的本实验是要实现线性表的集合运算,通过该实验更深刻地理解线性结构的特点,学会并掌握线性表的顺序或链式表示和实现。
二、实验内容与实验步骤采用线性表表示集合,用线性表实现集合以及基本操作,实现两个集合的并、交、差运算。
用到的各种函数如下程序步骤所示。
步骤:1. 链表销毁void DestoryList_L(list& L){ list p=L->next,s;while(p){ s=p; p=p->next;free(s);}L->next=NULL;}2. 链表初始化void InitList(list &L){ L=NULL;}3. 往链表L中插入元素e,并按升序排列,如果L中已有元素e,则不插入ListInsert_L(list &L, char e){ list p=L->next,t,s; t = L;while(p!=NULL &&p->data<= e){ if(p->data==e) return OK;t=p; p=p->next;}s =(list)malloc(sizeof(LNode));s->data=e;s->next=p;t->next=s;return OK;}4. 创建链表,按字符串输入元素void CreateList_L(list &L, int n){ L =(list)malloc(sizeof(LNode));L->next=NULL;int i=0;for(i=n;i>0;i--){ char e; scanf("%c",&e);ListInsert_L(L,e);}getchar();}5.定义输入函数,分配存储空间void inputdata(list head)//定义输入函数{ list p;char tmp;scanf("%c",&tmp);while(tmp!='\n'){ p=(list)malloc(sizeof(struct LNode));//分配存储空间p->data=tmp;p->next=head->next;head->next=p;scanf("%c",&tmp); }}6.定义输出函数,初始化,并判断其是否为空void outputdata(list head)//定义输出集合函数{ list p;p=head->next;//初始化,p指向第一个结点while(p!=NULL)//判断是否为空{ printf("%c",p->data);p=p->next;} printf("\n");//输出集合函数}7.定义集合的并集函数,其中函数的数据元素均已按值非递减排列void MergeList(list head1,list head2,list head3)//定义集合的并集函数{//已知p1、p2中的数据元素按值非递减排列。
数据结构实验报告_实验报告_
数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。
本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。
2) 利用栈,实现任一个表达式中的语法检查(选做)。
3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。
数据结构实验报告
《数据结构》实验报告◎实验题目:合并两个链表,设A与B分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列),list1和list2分别为指向两个链表的头指针。
请写出将这两个链表合并为一个带头结点的有序循环链表的算法。
◎实验目的:使用顺序表的创建、插入、删除,合并等操作编写关于数据结构的程序。
◎实验内容:写出相关程序并上机调试、通过。
一、需求分析1.本程序以用户和计算机的对话方式执行,在计算机终端要求输入两组域值从小到大排列的链表数据,终端显示“第一个链表”时,用户输入第一个链表的元素,终端显示“第二个链表”时,用户输入第二个链表的元素,按回车键结束输入;2.输入两组数据后,输出一个形式为两个链表中元素合并成一个链表并且其中元素按照递增的顺序排列;3.此程序能够把两个带有头结点的有序循环链表合并为一个带头结点的有序循环链表;4.程序执行的命令包括:(1)构造含有n个元素的循环链表,(2)输入数据,(3)将输入的数据做成有序循环链表,(4)合并两个链表,(5)输出新生成的链表,(6)结束。
5.测试数据示例请输入两个循环链表,以回车键结束:第一个链表:1 5 9 18第二个链表:2 3 6 11合并两个链表输出为:1 2 3 5 6 9 11 18Press any key to continue二、概要设计1.基本操作本程序,用单向有序循环链表作为存储结构。
(1)OrderInsertList(OrdCircList*,int)有序的在链表中插入元素(2)CombineTwoOrderList(OrdCircList*,OrdCircList*,OrdCircList*) 合并两个有序循环链表到新的链表中(3)PrintList(OrdCircList*)输出循环链表2.模块调用图主程序模块创建带头结点的循环链表模块将输入的元素有序的插入链表模块合并两个有序循环链表到新的链表中模块输出链表模块三、详细设计1.结点类型:typedef struct List{int num;struct List *next;} OrdCircList;2.每个模块:(1)主函数:int main(void){char c = '0';int num,sum;OrdCircList *LA,*LB,*LC; //定义头指针OrdCircList *temp;//初始化头指针LA = LB = LC = NULL;OrdCircList list_1,list_2,list_3; //定义3个头结点//将头指针指向结点LA = &list_1;LB = &list_2;LC = &list_3;//初始化头结点list_1.num=list_2.num=list_3.num=0;//将头结点的next指针指向本身list_1.next = LA;list_2.next = LB;list_3.next = LC;printf("请输入两个循环链表,以回车键结束:\n");printf("第一个链表: ");do{c=getchar();if(c!=' ' && c!='\n'){sum=0; //用于计算一位或多位数时的和//将一个或多个字符转换成一个整数while(c!=' ' && c!='\n'){//atoi操作对象时以'\0'为结束符的字符串char a[2];a[0]=c;a[1]='\0';num=atoi(a);if(sum==0){sum=num;}else{sum=sum*10;sum=sum+num;}c=getchar(); //获取下一个字符,以判断一个整数的结束}OrderInsertList(LA,sum);}}while(c!='\n');//PrintList(LA);printf("第二个链表: ");do{c=getchar();if(c!=' ' && c!='\n'){sum=0; //用于计算一位或多位数时的和//将一个或多个字符转换成一个整数while(c!=' ' && c!='\n'){//atoi操作对象时以'\0'为结束符的字符串char a[2];a[0]=c;a[1]='\0';num=atoi(a);if(sum==0){sum=num;}else{sum=sum*10;sum=sum+num;}c=getchar(); //获取下一个字符,以判断一个整数的结束}OrderInsertList(LA,sum);}}while(c!='\n');//PrintList(LB);CombineTwoOrderList(LA,LB,LC);printf("合并两个链表输出为:");PrintList(LC);//释放掉申请的内存空间temp=LC;while(temp->next!=LC){temp=temp->next;}if(temp!=LC){temp->next=NULL; //让LC链表表尾空即让链表不循环方便释放temp=LC->next;free(temp);}return 0;}(2)归并递增的两个链表la、lb,得到新链表lc:void CombineTwoOrderList(OrdCircList *la,OrdCircList *lb,OrdCircList *lc){OrdCircList* cur_a,*cur_b,*cur_c,*temp;cur_a=la->next;cur_b=lb->next;cur_c=lc->next;while(la->num!=0 && lb->num!=0){//比较cur_a和cur_b大小,并作出if(cur_a->num>cur_b->num){lb->next=cur_b->next;lb->num--; //链表的结点数减一cur_c->next=cur_b;lc->num++; //链表数的结点加一cur_c=cur_c->next; //cur_c指向尾部的结点cur_b=lb->next; //将cur_b指向被处理好的结点的下一个结点}else{la->next=cur_a->next;la->num--; //链表的结点数减一cur_c->next=cur_a;lc->num++; //链表数的结点加一cur_c=cur_c->next; //cur_c指向尾部的结点cur_a=la->next; //将cur_b指向被处理好的结点的下一个结点}}//链表刚好都为空if(la->num==0 && lb->num==0)cur_c->next=lc ;//让链表lc循环if(la->num!=0)//链表a不为空时{temp=cur_a;while(temp->next!=la)//当temp指向la链表的头结点时结束{temp=temp->next;}//把la链表除头结点外的结点并入链表lc中cur_c->next=cur_a;temp->next=lc;lc->num+=la->num;la->num=0; //la链表只剩头结点其num必须为0la->next=la; //让链表la变成只有头结点的循环链表}if(lb->num!=0)//链表a不为空时{temp=cur_b;while(temp->next!=lb)//当temp指向lb链表的头结点时结束{temp=temp->next;}//把la链表除头结点外的结点并入链表lc中cur_c->next=cur_b;temp->next=lc;lc->num+=lb->num; //将lc链表的变正确了lb->num=0; //lb链表只剩头结点其num必须为0lb->next=lb; //让链表lb变成只有头结点的循环链表}}(3)有序的在链表中插入元素:void OrderInsertList(OrdCircList *head,int num){int count=0;OrdCircList *newnode,*cur,*pre; //建立三个指针cur=pre=head;newnode=NULL;newnode =(struct List *) malloc(sizeof(OrdCircList)); //申请一块空间作为新结点//如果申请空间失败if(!newnode){printf("Application memory failure!\n");exit(-1);}newnode->next = NULL;newnode->num = num;if(head->num==0) //只有头结点时{newnode->next = head->next;head->next = newnode;head->num++;count++;}else{cur=cur->next; //链表不为空时cur指针指向head指针的下一个while((count==0)&&(cur->num<=newnode->num)){if(cur->next==head){newnode->next=cur->next;cur->next=newnode;head->num++;count++;}else{pre=cur;cur=cur->next;}}if(count==0){newnode->next = cur;pre->next = newnode;head->num++;}}}(4)循环链表的输出:void PrintList(OrdCircList*head){OrdCircList *print;print = head;if(head->num==0) //链表为空时printf("This is a empty list!\n");else{while(print->next!=head) //以print指针指向头结点为结束{printf("%d ",print->next->num);print = print->next;}printf("\n");}}3.完整函数://合并两个有序的循环链表#include<stdio.h>#include<stdlib.h>typedef struct List{int num;struct List *next;} OrdCircList;void OrderInsertList(OrdCircList*,int); //有序地在链表中插入元素void PrintList(OrdCircList*); //输出循环链表//合并两个有序循环链表到新的链表中void CombineTwoOrderList(OrdCircList*,OrdCircList*,OrdCircList*);int main(void){char c = '0';int num,sum;OrdCircList *LA,*LB,*LC; //定义头指针OrdCircList *temp;//初始化头指针LA = LB = LC = NULL;OrdCircList list_1,list_2,list_3; //定义3个头结点//将头指针指向结点LA = &list_1;LB = &list_2;LC = &list_3;//初始化头结点list_1.num=list_2.num=list_3.num=0;//将头结点的next指针指向本身list_1.next = LA;list_2.next = LB;list_3.next = LC;printf("请输入两个循环链表,以回车键结束:\n");printf("第一个链表: ");do{c=getchar();if(c!=' ' && c!='\n'){sum=0; //用于计算一位或多位数时的和//将一个或多个字符转换成一个整数while(c!=' ' && c!='\n'){//atoi操作对象时以'\0'为结束符的字符串char a[2];a[0]=c;a[1]='\0';num=atoi(a);if(sum==0){sum=num;}else{sum=sum*10;sum=sum+num;}c=getchar(); //获取下一个字符,以判断一个整数的结束}OrderInsertList(LA,sum);}}while(c!='\n');//PrintList(LA);printf("第二个链表: ");do{c=getchar();if(c!=' ' && c!='\n'){sum=0; //用于计算一位或多位数时的和//将一个或多个字符转换成一个整数while(c!=' ' && c!='\n'){//atoi操作对象时以'\0'为结束符的字符串char a[2];a[0]=c;a[1]='\0';num=atoi(a);if(sum==0){sum=num;}else{sum=sum*10;sum=sum+num;}c=getchar(); //获取下一个字符,以判断一个整数的结束}OrderInsertList(LA,sum);}}while(c!='\n');//PrintList(LB);CombineTwoOrderList(LA,LB,LC);printf("合并两个链表输出为:");PrintList(LC);//释放掉申请的内存空间temp=LC;while(temp->next!=LC){temp=temp->next;}if(temp!=LC){temp->next=NULL; //让LC链表表尾空即让链表不循环方便释放temp=LC->next;free(temp);}return 0;}void OrderInsertList(OrdCircList *head,int num){int count=0;OrdCircList *newnode,*cur,*pre; //建立三个指针cur=pre=head;newnode=NULL;newnode =(struct List *) malloc(sizeof(OrdCircList)); //申请一块空间作为新结点//如果申请空间失败if(!newnode){printf("Application memory failure!\n");exit(-1);}newnode->next = NULL;newnode->num = num;if(head->num==0) //只有头结点时{newnode->next = head->next;head->next = newnode;head->num++;count++;}else{cur=cur->next; //链表不为空时cur指针指向head指针的下一个while((count==0)&&(cur->num<=newnode->num)){if(cur->next==head){newnode->next=cur->next;cur->next=newnode;head->num++;count++;}else{pre=cur;cur=cur->next;}}if(count==0){newnode->next = cur;pre->next = newnode;head->num++;}}}void PrintList(OrdCircList*head){OrdCircList *print;print = head;if(head->num==0) //链表为空时printf("This is a empty list!\n");else{while(print->next!=head) //以print指针指向头结点为结束{printf("%d ",print->next->num);print = print->next;}printf("\n");}}void CombineTwoOrderList(OrdCircList *la,OrdCircList *lb,OrdCircList *lc){OrdCircList* cur_a,*cur_b,*cur_c,*temp;cur_a=la->next;cur_b=lb->next;cur_c=lc->next;while(la->num!=0 && lb->num!=0){//比较cur_a和cur_b大小,并作出if(cur_a->num>cur_b->num){lb->next=cur_b->next;lb->num--; //链表的结点数减一cur_c->next=cur_b;lc->num++; //链表数的结点加一cur_c=cur_c->next; //cur_c指向尾部的结点cur_b=lb->next; //将cur_b指向被处理好的结点的下一个结点}else{la->next=cur_a->next;la->num--; //链表的结点数减一cur_c->next=cur_a;lc->num++; //链表数的结点加一cur_c=cur_c->next; //cur_c指向尾部的结点cur_a=la->next; //将cur_b指向被处理好的结点的下一个结点}}//链表刚好都为空if(la->num==0 && lb->num==0)cur_c->next=lc ;//让链表lc循环if(la->num!=0)//链表a不为空时{temp=cur_a;while(temp->next!=la)//当temp指向la链表的头结点时结束{temp=temp->next;}//把la链表除头结点外的结点并入链表lc中cur_c->next=cur_a;temp->next=lc;lc->num+=la->num;la->num=0; //la链表只剩头结点其num必须为0la->next=la; //让链表la变成只有头结点的循环链表}if(lb->num!=0)//链表a不为空时{temp=cur_b;while(temp->next!=lb)//当temp指向lb链表的头结点时结束{temp=temp->next;}//把la链表除头结点外的结点并入链表lc中cur_c->next=cur_b;temp->next=lc;lc->num+=lb->num; //将lc链表的变正确了lb->num=0; //lb链表只剩头结点其num必须为0lb->next=lb; //让链表lb变成只有头结点的循环链表}}四、使用说明、测试分析及结果1.运行界面 Microsoft Visual C++2.测试结果五、实验总结1.此实验要求生成一个新的有序循环链表,重点在于将两个循环链表la、lb合并得到新链表lc,并使lc也同样是有序循环链表。
数据结构实验排序
数据结构实验报告排序一、实习目的熟悉几种典型的排序方法,并对各种算法的特点、使用范围和效率有进一步的了解。
二、实例排序是计算机科学中非常基本且使用频繁的运算,在计算机系统软件和应用软件中都有广泛的应用。
下面给出的是冒泡排序、快速排序的实现与比较。
/* 源程序的头文件sort.h */void getra ndat(Data ary[],i nt cou nt) /* 产生一批随机数,准备排序*/{ long int a=100001;int i;for(i=0;i<cou nt;i++){ a=(a*125)%2796203;ary[i].key=(i nt)a;}} /* getra ndat */void prdata(Data ary[],i nt count) I*输出数据的函数*/{ int i; char ch;printf( n“);for(i=0;i<count;i++) printf( “ %6c”,ary[i].key);printf( n“);printf( "\n\n 打回车键,结束显示。
“);ch=getch();} I* prdata *I[两种排序方法的比较源程序]I* sortcmp.c *I#in clude <stdio.h>#in clude <stdlib.h>#define MAX 1000 I*数组最大界限*Itypedef int ElemType; I* 关键字的类型*Itypedef struct{ ElemType key;int shu;}Data;Data ar[MAX],br[MAX];typedef struct{ int lo,hi;}Selem;typedef struct{ Selem elem[MAX];int top;}SqStack;SqStack s1;/* 函数声明*/void bubble(Data ary[],int n);void getrandat(Data ary[],int count) ; void qksort(Data ary[],int n);void hoare(Data ary[],int l,int h); void init_s(SqStack *s);void push(SqStack *s,Selem e); Selem pop(SqStack *s);void prdata(Data ary[],int count); int empty(SqStack s);/* 主函数*//* 其它属性域*//* 一个纪录的结构体类型*//* 栈的元素结构体类型*//* 一维数组子域*//* 栈顶指针子域*//* 栈的顺序结构体类型*//* 产生一批随机数,准备排序*//* 进栈一个元素*/ /* 输出数据的函数*/void main(){ int k,n,j; j; char ch;do { printf("\n\n\n");printf("\n\n 1. 产生一批随机数准备排序");printf("\n\n 2. 一般情况的起泡排序");printf("\n\n 3. 有序情况的起泡排序");printf("\n\n 4. 一般情况的快速排序");printf("\n\n 5. 有序情况的快速排序");printf("\n================== printf("\n 请输入您的选择 scanf("%d",&k); switch(k){ case 1:{ printf("the number ofdatas:"); /*scanf("%d",&n);getrandat(ar,n); for(j=0;j<n;j++)br[j]=ar[j]; prdata(ar,n); } break;case 2:{ for(j=0;j<n;j++) ar[j]=br[j];bubble(ar,n); prdata(ar,n); } break;case 3: { bubble( ar,n); prdata(ar,n);} break;=================="); (1,2,3,4,5,6)");输入数据个数 *//*产生 n 个随机数 *//* 保留复原始数据 *//* 恢复原始数据 */ /* 对 n 个数据起泡排序 *//* 排序后输出 *//* 有序情况的起泡排序 */ 恢复原始数据*//* 对 n 个数据快速排序 *//* 排序后输出 *//* 有序情况的快速排序 */case 4:{ for(j=0;j<n;j++) ar[j]=br[j]; /*qksort(ar,n); prdata(ar,n);} break;case 5:{ qksort(ar,n);prdata(ar,n);} break;case 6: exit(0);} /* switch */printf("\n --------------- ");}while(k>=1 && k<6);printf("\n 打回车键,返回。
数据结构试验报告-图的基本操作
中原工学院《数据结构》实验报告学院:计算机学院专业:计算机科学与技术班级:计科112姓名:康岩岩学号:201100814220 指导老师:高艳霞2012-11-22实验五图的基本操作一、实验目的1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、熟练掌握图的两种遍历算法。
二、实验内容[问题描述]对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
【设计思路】【代码整理】#include "stdafx.h"#include <iostream>#include <malloc.h>using namespace std;typedef int Status;#define OK 1#define ERROR 0#define OVERFLOW -1#define MAX_SIZE 20typedef enum{DG,DN,UDG,UDN}Kind;typedef struct ArcNode{int adjvex; //顶点位置struct ArcNode *nextarc; //下一条弧int *info; //弧信息};typedef struct{char info[10]; //顶点信息ArcNode *fistarc; //指向第一条弧}VNode,AdjList[MAX_SIZE];typedef struct{AdjList vertices;int vexnum,arcnum; //顶点数,弧数int kind; //图的种类,此为无向图}ALGraph;//这是队列的节点,仅用于广度优先搜索typedef struct Node{int num;struct Node* next;};//队列的头和尾typedef struct{Node * front;Node *rear;}PreBit;int LocateV ex(ALGraph G,char info[]);//定位顶点的位置Status addArcNode(ALGraph &G,int adjvex); //图中加入弧Status CreatGraph(ALGraph&G);//创建图的邻接表Status DFSTraverse(ALGraph G);//深度优先搜索Status BFSTraverse(ALGraph G);//广度优先搜索Status DFS(ALGraph G,int v);//深度优先搜索中的数据读取函数,用于递归bool visited[MAX_SIZE]; // 访问标志数组//初始化队列Status init_q(PreBit&P_B){P_B.front=P_B.rear=(Node*)malloc(sizeof(Node));if(!P_B.front){exit(OVERFLOW);}P_B.front->next=NULL;}//将数据入队Status en_q(PreBit & P_B,int num){Node *p=(Node*)malloc(sizeof(Node));if(!p){exit(OVERFLOW);}p->num=num;p->next=NULL;P_B.rear->next=p;P_B.rear=p;return OK;}//出队Status de_q(PreBit & P_B){if(P_B.front==P_B.rear){return ERROR;}Node* p=P_B.front->next;P_B.front->next=p->next;if(P_B.rear==p){P_B.rear=P_B.front;}free(p);return OK;}Status CreatGraph(ALGraph&G){cout<<"请输入顶点数目和弧数目"<<endl;cin>>G.vexnum>>G.arcnum;//依次输入顶点信息for(int i=0;i<G.vexnum;i++){cout<<"请输入顶点名称"<<endl;cin>>G.vertices[i].info;G.vertices[i].fistarc=NULL;}//依次输入弧信息for(int k=1;k<=G.arcnum;k++){char v1[10],v2[10]; //用于表示顶点名称的字符数组int i,j; //表示两个顶点的位置BACK: //返回点cout<<"请输入第"<<k<<"条弧的两个顶点"<<endl;cin>>v1>>v2;i=LocateV ex(G,v1); //得到顶点v1的位置j=LocateV ex(G,v2); //得到顶点v2的位置if(i==-1||j==-1){ //头信息不存在则返回重输cout<<"不存在该节点!"<<endl;goto BACK; //跳到BACK 返回点}addArcNode(G,i); //将弧的顶点信息插入表中addArcNode(G,j);}return OK;}//倒序插入弧的顶点信息Status addArcNode(ALGraph &G,int adjvex){ArcNode *p; //弧节点指针p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=adjvex;p->nextarc=G.vertices[adjvex].fistarc;//指向头结点的第一条弧G.vertices[adjvex].fistarc=p; //头结点的第一条弧指向p,即将p作为头结点的第一条弧return OK;}//定位顶点的位置int LocateV ex(ALGraph G,char info[]){for(int i=0;i<G.vexnum;i++){if(strcmp(G.vertices[i].info,info)==0){ //头结点名称与传入的信息相等,证明该头节点存在return i; //此时返回位置}}return -1;}//深度优先搜索Status DFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int i;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;i=LocateV ex(G,v1);if(i==-1){cout<<"不存在该节点!"<<endl;goto BACK;}DFS(G,i);return OK;}//深度优先搜索递归访问图Status DFS(ALGraph G,int v){visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息ArcNode *p;p=G.vertices[v].fistarc; //向头节点第一条while(p) //当弧存在{if(!visited[p->adjvex]){DFS(G,p->adjvex); //递归读取}p=p->nextarc;}return OK;}//广度优先搜索Status BFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int v;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;v=LocateV ex(G,v1);if(v==-1){cout<<"不存在该节点!"<<endl;goto BACK;}PreBit P_B;init_q(P_B);ArcNode *p;visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息en_q(P_B,v); //将头位置v入队while(P_B.front!=P_B.rear){//当队列不为空时,对其进行访问int w=P_B.front->next->num;//读出顶点位置de_q(P_B);//顶点已经访问过,将其出队列p=G.vertices[w].fistarc;//得到与顶点相关的第一条弧while(p){if(!visited[p->adjvex]){en_q(P_B,p->adjvex);//将弧入队,但不读取,只是将其放在队尾}p=p->nextarc;}}return OK;}int _tmain(int argc, _TCHAR* argv[]){ALGraph G;CreatGraph(G);cout<<"深度优先搜索图:"<<endl;DFSTraverse(G);cout<<endl;cout<<"广度优先搜索图:"<<endl;BFSTraverse(G);cout<<endl;system("pause");return 0;}。
数据结构实验报告总结
数据结构实验报告总结本次数据结构实验主要涉及到线性表、栈和队列的基本操作,通过实验操作和总结,我对数据结构的相关知识有了更深入的理解和掌握。
首先,我们进行了线性表的实验操作。
线性表是一种数据结构,它是由n(n≥0)个数据元素组成的有限序列。
在实验中,我们学习了线性表的顺序存储结构和链式存储结构。
通过代码实现,我深刻理解了顺序表和链表的存储方式和特点。
在实验过程中,我发现顺序表适合查找操作,而链表适合插入和删除操作。
这让我对线性表的应用场景有了更清晰的认识。
其次,我们进行了栈的实验操作。
栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
在实验中,我学习了栈的基本操作,包括入栈和出栈。
通过实际操作,我深刻理解了栈的“先进后出”的特性,以及它在计算机程序设计中的应用。
我发现栈在递归算法、表达式求值和括号匹配等方面有着重要的作用,这让我对栈的实际应用有了更深入的认识。
最后,我们进行了队列的实验操作。
队列是一种特殊的线性表,它只能在表的一端进行插入操作,而在另一端进行删除操作。
在实验中,我学习了队列的基本操作,包括入队和出队。
通过实际操作,我深刻理解了队列的“先进先出”的特性,以及它在计算机程序设计中的重要性。
我发现队列在广度优先搜索、模拟系统等方面有着重要的应用,这让我对队列的实际应用有了更深入的了解。
通过本次数据结构实验,我不仅掌握了线性表、栈和队列的基本操作,还深刻理解了它们在实际应用中的重要性。
我相信这些知识和经验对我的学习和工作都将有着重要的帮助。
在未来的学习和实践中,我将继续加强对数据结构的理解和运用,不断提升自己的编程能力和解决问题的能力。
总之,本次数据结构实验让我受益匪浅,我将继续努力学习和实践,不断提升自己的专业能力。
希望通过不懈的努力,能够在数据结构领域取得更大的成就。
数据结构实验报告及心得体会
2011~2012第一学期数据结构实验报告班级:信管一班学号:201051018姓名:史孟晨实验报告题目及要求一、实验题目设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。
1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统),输出实验结果。
(15分)2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学生的学号、姓名和成绩。
3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。
二、实验要求1.修改算法。
将奇偶排序算法升序改为降序。
(15分)2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。
(45分))3.编译、链接以上算法,按要求写出实验报告(25)。
4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。
5.用A4纸打印输出实验报告。
三、实验报告说明实验数据可自定义,每种排序算法数据要求均不重复。
(1) 实验题目:《N门课程学生成绩名次排序算法实现》;(2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性;(3) 实验要求:对算法进行上机编译、链接、运行;(4) 实验环境(Windows XP-sp3,Visual c++);(5) 实验算法(给出四种排序算法修改后的全部清单);(6) 实验结果(四种排序算法模拟运行后的实验结果);(7) 实验体会(文字说明本实验成功或不足之处)。
三、实验源程序(算法)Score.c#include "stdio.h"#include "string.h"#define M 6#define N 3struct student{ char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M];void changesort(struct student a[],int n,int j){int flag=1,i;struct student temp;while(flag){ flag=0;for(i=1;i<n-1;i+=2) /*对所有奇数项进行一遍比较*/ if (a[i].score[j]>a[i+1].score[j]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}for(i=0;i<n-1;i+=2) /*对所有偶数项进行一遍比较*/if (a[i].score[j]>a[i+1].score[j]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}void print_score(struct student a[],int n,int j){ int i,k;printf(“ 奇偶交换成绩 %d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){ if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;p rintf(" %4d ",k);p rintf("%4d",a[i].number);p rintf(" %s",a[i].name);p rintf(" %6d",a[i].score[j]);p rintf("\n");}}main(){ int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{ printf("请输入第 %d 名学生分数: ",i+1);printf("\n"); printf("姓名: ");s canf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{ stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];}changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n"); k=1;for(i=0;i<M;i++){ if(i>0&&stu[i].score[N]!=stu[i-1].score[N])k++;printf("%4d",k);printf(" %4d",stu[i].number);printf(" %s",stu[i].name);for(j=0;j<N+1;j++)printf(" %6d",stu[i].score[j]);printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前 3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前 3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前 3 名同学成绩*/}源代码结果:请输入第1 名学生分数: 姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数: 姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第 3 名学生分数: 姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数: 姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数: 姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数: 姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 5 张一析78 68 91 2372 2 袁欣78 80 92 2503 4 滕芷79 84 88 2514 6 白晓彤88 76 90 2545 1 史孟晨87 90 78 2556 3 赵宇88 76 95 259 奇偶交换成绩1 排序表名次学号姓名分数1 5 张一析781 2 袁欣782 4 滕芷793 1 史孟晨87奇偶交换成绩2 排序表名次学号姓名分数1 5 张一析682 6 白晓彤762 3 赵宇763 2 袁欣80奇偶交换成绩3 排序表名次学号姓名分数1 1 史孟晨782 4 滕芷883 6 白晓彤90Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int flag=1,i;struct student temp;while(flag){flag=0;for(i=1;i<n-1;i+=2) /*对所有奇数项进行一遍比较*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}for(i=0;i<n-1;i+=2) /*对所有偶数项进行一遍比较*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 奇偶交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}升序改降序:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 奇偶交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79奇偶交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80 奇偶交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int flag=1,i,m,k;struct student temp;while(flag){flag=0;for(i=0;i<n-1;i++) /*选择排序法*/{k=i;for(m=i+1;m<n;m++)if (a[m].score[j]>a[k].score[j]){k=m;temp=a[i];a[i]=a[k];a[k]=temp;flag=1;}}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 选择交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}简单选择:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 选择交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79选择交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80 选择交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){{int flag=1,i;struct student temp;while(flag){flag=0;for(i=0;i<n;i++) /*冒泡排序法*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 冒泡交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}运行结果:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 冒泡交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79冒泡交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80冒泡交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continueJusertsort.c#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];}changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int i, m;struct student temp;/*插入排序法*/for(i=1; i<n; i++){temp = a[i];for(m=i; m>0 && temp.score[j] > a[m-1].score[j]; m--){a[m] = a[m-1];}a[m] = temp;}}void print_score(struct student a[],int n,int j){int i,k;printf(" 插入交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 插入交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79插入交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80插入交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91Press any key to continue心得体会本学期开设的《数据结构基础》课程已经告一段落,现就学习体会进行学习总结.这是一门纯属于设计的科目,它需用把理论变为上机调试。
数据结构 实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
操作系统为 Windows 10。
三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。
对链表进行排序,如冒泡排序或插入排序。
2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。
利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。
3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。
进行二叉树的插入、删除节点操作。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先遍历和广度优先遍历。
四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。
数据结构实验一 实验报告
班级:姓名:学号:实验一线性表的基本操作一、实验目的1、掌握线性表的定义;2、掌握线性表的基本操作;如建立、查找、插入和删除等..二、实验内容定义一个包含学生信息学号;姓名;成绩的顺序表和链表二选一;使其具有如下功能:1 根据指定学生个数;逐个输入学生信息;2 逐个显示学生表中所有学生的相关信息;3 根据姓名进行查找;返回此学生的学号和成绩;4 根据指定的位置可返回相应的学生信息学号;姓名;成绩;5 给定一个学生信息;插入到表中指定的位置;6 删除指定位置的学生记录;7 统计表中学生个数..三、实验环境Visual C++四、程序分析与实验结果#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; // 定义函数返回值类型typedef struct{char num10; // 学号char name20; // 姓名double grade; // 成绩}student;typedef student ElemType;typedef struct LNode{ElemType data; // 数据域struct LNode *next; //指针域}LNode;*LinkList;Status InitListLinkList &L // 构造空链表L {L=struct LNode*mallocsizeofstruct LNode; L->next=NULL;return OK;}Status GetElemLinkList L;int i;ElemType &e // 访问链表;找到i位置的数据域;返回给 e{LinkList p;p=L->next;int j=1;whilep&&j<i{p=p->next;++j;}ifp||j>i return ERROR;e=p->data;return OK;}Status SearchLNode L;char str;LinkList &p // 根据名字查找{p=L.next;whilep{ifstrcmpp->;str==0return OK;p=p->next;}return ERROR;}Status ListInsertLinkList L;int i;ElemType e // 在i个位置插入某个学生的信息{LinkList p;s;p=L;int j=0;whilep&&j<i-1{p=p->next;++j;}ifp||j>i-1 return ERROR;s=struct LNode*mallocsizeofLNode;s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDeleteLinkList p;int i // 删除i位置的学生信息{int j=0;whilep->next&&j<i-1{p=p->next;++j;}ifp->next||j>i-1 return ERROR;LinkList q;q=p->next;p->next=q->next;delete q;return OK;}void InputElemType *e{printf"姓名:"; scanf"%s";e->name;printf"学号:"; scanf"%s";e->num;printf"成绩:"; scanf"%lf";&e->grade;printf"输入完成\n\n";}void OutputElemType *e{printf"姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n";e->name;e->num;e->grade;}int main{LNode L;LinkList p;ElemType a;b;c;d;printf"\n********************************\n\n";puts"1. 构造链表";puts"2. 录入学生信息";puts"3. 显示学生信息";puts"4. 输入姓名;查找该学生";puts"5. 显示某位置该学生信息";puts"6. 在指定位置插入学生信息";puts"7. 在指定位置删除学生信息";puts"8. 统计学生个数";puts"0. 退出";printf"\n********************************\n\n"; int x;choose=-1;whilechoose=0{puts"请选择:";scanf"%d";&choose;switchchoose{case 1:ifInitListpprintf"成功建立链表\n\n";elseprintf"链表建立失败\n\n";break;case 2:printf"请输入要录入学生信息的人数:";scanf"%d";&x;forint i=1;i<=x;i++{printf"第%d个学生:\n";i;Input&a;ListInsert&L;i;a;}break;case 3:forint i=1;i<=x;i++{GetElem&L;i;b;Output&b;}break;case 4:char s20;printf"请输入要查找的学生姓名:";scanf"%s";s;ifSearchL;s;pOutput&p->data;elseputs"对不起;查无此人";puts"";break;case 5:printf"请输入要查询的位置:";int id1;scanf"%d";&id1;GetElem&L;id1;c;Output&c;break;case 6:printf "请输入要插入的位置:";int id2;scanf"%d";&id2;printf"请输入学生信息:\n";Input&d;ifListInsert&L;id2;d{x++;puts"插入成功";puts"";}else{puts"插入失败";puts"";}break;case 7:printf"请输入要删除的位置:";int id3;scanf"%d";&id3;ifListDelete&L;id3{x--;puts"删除成功";puts"";}else{puts"删除失败";puts"";}break;case 8:printf"已录入的学生个数为:%d\n\n";x;break;}}printf"\n\n谢谢您的使用;请按任意键退出\n\n\n"; system"pause";return 0;}用户界面:(1)根据指定学生个数;逐个输入学生信息:(2)逐个显示学生表中所有学生的相关信息:(3)根据姓名进行查找;返回此学生的学号和成绩:(4)根据指定的位置可返回相应的学生信息学号;姓名;成绩:(5)给定一个学生信息;插入到表中指定的位置:(6)删除指定位置的学生记录:(7)统计表中学生个数:五、实验总结数据结构是一门专业技术基础课..它要求学会分析研究计算机加工的数据结构的特性;以便为应用涉及的数据选择适当的逻辑结构;存储结构及相应的算法;并初步掌握算法的时间分析和空间分析技术..不仅要考虑具体实现哪些功能;同时还要考虑如何布局;这次的实验题目是根据我们的课本学习进程出的;说实话;我并没有真正的读懂书本的知识;所以刚开始的时候;感到很棘手;于是又重新细读课本;这一方面又加强了对书本的理解;在这上面花费了一些心血;觉得它并不简单;是需要花大量时间来编写的....在本次实验中;在程序构思及设计方面有了较大的锻炼;能力得到了一定的提高..。
数据结构停车场实验报告
工商学院数据结构实验报告年级2012 学号2012007554 姓名刘怡然成绩专业电气实验地点B3-401 指导教师许文强实验项目模拟停车场管理程序的设计与实现实验日期2013.11.7一、实验目的本实验的目的是进一步理解栈和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。
二、实验问题描述设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该车辆开出大门,为它让路的车辆再按原次序进入车场。
在这里假设汽车不能从便道上开走,试设计这样一个停车厂模拟管理程序。
为了以下描述的方便,停车厂的停车场用“停车位”进行叙述,停车厂的便道用“便道”进行叙述。
三、实验步骤1、实验问题分析使用两个栈和一个队列。
分别为停车栈和辅助栈,队列为便道,当有车来时先进入停车场,没有空位时不能进入,停入便道。
当停车场有车要开出时,判断它的后面有没有车,没有直接开出,否则将后面的车挪入辅助栈将目标车开出。
再将辅助栈车按次序挪回停车栈。
此时判断便道上是否有车等待,有就将便道上的车按先到先出的次序停入停车场。
2、功能(函数)设计V oid Main(); 菜单stopping *init_stopping(); 初始化停车栈buffer *init_buff(); 初始化辅助栈pavement *init_pavement(); 初始化便道int car_come(stopping *s,pavement *q); 有来车int car_leave(int pos,stopping *s,buffer *b,pavement *q); 有车开走int stop_to_buff(int pos,stopping *s,buffer *b); 停车栈挪向辅助栈int buff_to_stop(stopping *s,buffer *b); 辅助栈挪向停车栈int pave_to_stop(stopping *s,pavement *q); 便道队列挪向停车栈int car_disp(stopping *s,pavement *q); 显示停车情况void Now(stopping *s,pavement *q); 实时统计停车数量四、实验结果(程序)及分析1、实验主要代码car.h#pragma oncetypedef struct{char license_plate[10]; //车牌号char state; //状态}car;Buffer.h#include"car.h"#include"stopping.h"typedef struct{car bufferx[MAX_STOP]; /*各汽车信息的存储空间*/int top; /*用来指示栈顶位置的静态指针*/}buffer;Pavement.h#include"car.h"#define MAX_PA VE 100 /*便道不限制停放车辆的数目,设为足够大*/ typedef struct{car pave[MAX_PA VE]; /*各汽车信息的存储空间*/int front,rear; /*用来指示队头和队尾位置的静态指针*/}pavement;Stopping.h#pragma once#include"car.h"#define MAX_STOP 5typedef struct{car stop[MAX_STOP]; /*各汽车信息的存储空间*/int top; /*用来指示栈顶位置的静态指针*/ }stopping;Main.cpp#include "buffer.h"#include "car.h"#include "pavement.h"#include "stopping.h"#include "iostream.h"#include "conio.h"#include "stdio.h"#include <stdlib.h>stopping *init_stopping();buffer *init_buff();pavement *init_pavement();int car_come(stopping *s,pavement *q);int car_leave(int pos,stopping *s,buffer *b,pavement *q);int stop_to_buff(int pos,stopping *s,buffer *b);int buff_to_stop(stopping *s,buffer *b);int pave_to_stop(stopping *s,pavement *q);int car_disp(stopping *s,pavement *q);void Now(stopping *s,pavement *q);void main(){int pos;stopping s;buffer b;pavement q;s=*init_stopping();b=*init_buff();q=*init_pavement();char c;for(;;){system("cls");printf("\n ________________ ");printf("\n ---------------------------| 停车场管理系统|------------------------");printf("\n ^^^^^^^^^^^^^^^^ \n\n");cout<<" ||--------------------------按0键结束程序----------------------||"<<endl;cout<<" ||--------------------------按1键有车进入----------------------||"<<endl;cout<<" ||--------------------------按2键有车离开----------------------||"<<endl;cout<<" ||--------------------------按3键显示情况----------------------||"<<endl;Now(&s,&q);c=getch();if(c=='0')break;switch(c){case '1':car_come(&s,&q);getch();break;case '2':cout<<"请输入开出车辆位置:";cin>>pos;car_leave(pos,&s,&b,&q);getch();break;case '3':car_disp(&s,&q);getch();break;}}}void Now(stopping *s,pavement *q){printf("当前实时车辆统计:停车场----%d辆便道----%d辆\n",s->top+1,q->rear-q->front); }stopping *init_stopping(){stopping *s;s=new stopping;if(!s)return NULL;else{s->top=-1;return s;}}buffer *init_buff(){buffer *b;b=new buffer;if(!b)return NULL;else{b->top=-1;return b;}}pavement *init_pavement() {pavement *q;q=new pavement;q->front=q->rear=-1;return q;}int car_come(stopping *s,pavement *q){car *c;c=new car;cout<<"请输入汽车牌照号:";cin>>c->license_plate;c->state='i';if(s->top==MAX_STOP-1){c->state='s';q->rear++;q->pave[q->rear]=*c;cout<<"停车位满!汽车"<<c->license_plate<<"停入便道。
数据结构实验报告(实验一)
数据结构实验报告(实验一)同学们!今天咱们来唠唠这个数据结构实验报告里的实验一哈。
这就像是一场小冒险,你得跟着那些数据在代码的世界里闯荡。
首先呢,咱们得搞清楚这个实验一的目标是啥。
就好比你要去一个地方旅游,你得知道目的地是哪儿吧。
这个实验一可能是让我们熟悉某种数据结构,比如说数组。
这数组啊,就像一个个小格子排成的队伍,每个小格子里能放东西。
我刚接触的时候就想,这玩意儿有啥难的呀?不就是把数据往里塞嘛。
结果,还真不是那么简单。
咱就说在操作数组的时候吧。
你要往里面插入一个元素,就像是在一群排队的人中间硬塞进去一个人。
你得把后面的人都往后挪一挪,给这个新的家伙腾地方。
这时候就可能会出现问题了。
我记得我第一次写这个插入函数的时候,就把后面的元素给挪错了,就像一个糊涂的指挥员,把队伍搞得乱七八糟。
当时我就想,哎这数据结构还真是个小妖精,不好对付。
然后就是查找元素了。
这就像是在一群人里找一个特定的人。
你得一个一个地看,从数组的开头开始,一直到找到为止。
我就想啊,要是有个魔法能一下子就找到该多好啊。
可是哪有那么容易呢?有时候这个数组很大,你就得慢慢地找,就像在大海里捞针一样。
我还试过一些优化的方法,比如说二分查找。
这就像是把大海分成两半,然后再分,直到找到那根针。
但是呢,这二分查找也有它的条件,数组得是有序的才行。
这就好比你要找的人得站在一个有秩序的队伍里,不然这方法就不灵了。
再说说删除元素吧。
这就像是把队伍里的一个人赶走,然后再把后面的人往前拉一拉,填补这个空缺。
我当时就搞混了这个填补的顺序,结果就出现了一些奇怪的结果。
就像你把一个拼图块拿出来,却把其他的拼图块放错了位置,整个画面就变得很奇怪。
在做这个实验一的过程中,我也遇到了很多困难。
比如说,代码里老是出现一些莫名其妙的错误。
我就对着电脑屏幕发呆,心里想:“这到底是咋回事儿呢?难道是电脑在跟我作对?”有时候,我甚至怀疑自己是不是不适合学这个数据结构。
但是呢,我又不甘心就这么放弃。
数据结构课程设计实验报告哈夫曼
数据结构课程设计实验报告哈夫曼树的应用计算机学院信管专业数据结构课程设计题目:哈夫曼树的应用班级:姓名:学号:同组人姓名:起迄日期:课程设计地点:指导教师:完成日期:2012年12月目录一、需求分析 (3)二、概要设计 (4)三、详细设计 (6)四、调试分析和测试结果 (7)五、心得体会和总结 (10)六、参考文献 (10)七、附录 (11)一、需求分析(一)实验要求要求用到数据结构课上学到的线性表的知识,所以就要充分而清晰的理解关于线性表的知识。
要求实现的基本功能很简单,只有删除和插入,增加功能也不过是加上修改。
这些在数据结构课上已经讲过,只要能够理解关于线性表的几个相关的基本算法就可以了。
问题是将输入的信息保存入文件和从文件输出。
这里基本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。
综上,做这个课题,要具备的知识就是线性表的基本算法,文件的保存和读取算法,必要的C或者C++知识(本次我将使用C++实现),以及丰富的程序调适经验。
(二)实验任务一个完整的系统应具有以下功能:功能1.从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;功能2.利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中,并输出结果,将文件CodeFile以紧凑格式先是在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrint中。
功能3.利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中,并输出结果。
(三)实验步骤分步实施:1)初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2)完成最低要求:完成功能1;3)进一步要求:完成功能2和3。
有兴趣的同学可以自己扩充系统功能。
数据结构实验报告_9
本科生实验报告(二)姓名:学院:专业:班级:实验课程名称: 数据结构实验日期: 2013年 5月 25 日指导教师及职称:实验成绩:开课时间:2012~2013 学年第二学期k++;a[j][n-i-1]=k;}for (j=n-i-2;j>=i;j--){k++;a[n-i-1][j]=k;}for (j=n-i-2;j>=i+1;j--){k++;[j][i]=k;}}}void main(){int n,i,j;int a[MaxLen][MaxLen];printf("输入n(n<10):");scanf("%d",&n);fun(a,n);printf("%d阶数字方阵如下:\n",n);for (i=0;i<n;i++){for (j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}}运行结果:6.2:如果矩阵A中存在这样的一个元素A[i][j]满足条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称为该矩阵的一个马鞍点。
设计一个程序exp6-2.cpp 计算出m*n的矩阵A的所有马鞍点。
主程序如下:6.3:已知A和B为两个n*n阶的对称矩阵,输入时,对称矩阵只输入下三角形元素,存入一维数组,如图6.5所示(对称矩阵M存储在一维数组A中),设计一个程序exp6-3.cpp 实习如下功能:(1)求对称矩阵A和B的和。
(2)求对称矩阵A和B的乘积。
A:图6.5 对称矩阵的存储转换形式主程序如下:#include <stdio.h>#define N 4#define M 10int value(int a[],int i,int j){if (i>=j)return a[(i*(i-1))/2+j];elsereturn a[(j*(j-1))/2+i];}void madd(int a[],int b[],int c[][N]){int i,j;for (i=0;i<N;i++)printf("a+b:\n");disp2(c1);printf("a×b:\n");disp2(c2);printf("\n");}运行结果:6.4::假设n*n的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能:(1)生成如下两个稀疏矩阵矩阵的三元组a和b:(2)输出a转置矩阵的三元组;(3)输出a+b的三元组;(4)输出a*b的三元组。
《数据结构》2012级实验报告模板
实验报告(一)一、实验目的:1.掌握VC6.0开发环境下C/C++程序的编辑、编译和运行。
2.通过实验回顾复习C语言中关于结构体、指针等知识的应用。
3.了解学习数据结构的主要方法和课程的主要知识框架。
二、实验环境:个人电脑、Windows XP、VC6.0或以上版本。
三、实验内容、程序代码、程序测试运行界面1.设计一个程序,输出所有小于等于n(n为一个大于2的正整数)的素数。
要求:(1)每行输出10个素数;(2)尽可能采用较优的算法。
2.编写一个程序,计算任一输入的正整数的各位数字之和,并分析算法的时间复杂度。
3.编写一个程序,判断一个字符串是否为“回文”(顺读和倒读都一样的字符串称为“回文”),并分析算法的时间复杂度。
四、心得体会与建议实验报告(二)一、实验目的:1.熟练掌握线性表的顺序存储结构的概念及各种基本操作的C语言实现。
2.熟练掌握线性表的链式存储结构中的单链表的概念及各种基本操作的C 语言实现。
3.了解双向链表及循环链表的基本操作。
二、实验环境:个人电脑、Windows XP、VC6.0或以上版本。
三、实验内容、程序代码、程序测试运行界面1.编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为char),并在此基础上设计一个程序完成如下功能:(1)初始化顺序表L;(2)采用尾插法依次插入元素a,b,c,d,e;(3)输出顺序表L;(4)输出顺序表L长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第3个元素;(7)输出元素a的位置;(8)在第4个位置上插入元素f;(9)输出顺序表L;(10)删除L的第3个元素;(11)输出顺序表L;(12)释放顺序表L。
程序代码如下:程序运行结果如下:2.编写一个程序,实现单链表的各种基本运算(假设单链表的元素类型为char),并在此基础上设计一个程序,完成如下功能:(1)初始化单链表h;(2)采用尾插法依次插入元素a,b,c,d,e;(3)输出单链表h;(4)输出单链表h长度;(5)判断单链表h是否为空;(6)输出单链表h的第3个元素;(7)输出元素a的位置;(8)在第4个位置上插入元素f;(9)输出单链表h;(10)删除h的第3个元素;(11)输出单链表h;(12)释放单链表h。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过实验可以更深入地理解和掌握数据结构的概念、原理和应用。
本次实验的主要目的包括:1、熟悉常见的数据结构,如链表、栈、队列、树和图等。
2、掌握数据结构的基本操作,如创建、插入、删除、遍历等。
3、提高编程能力和解决实际问题的能力,能够运用合适的数据结构解决具体的问题。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的实现与操作单向链表的创建、插入和删除节点。
双向链表的实现和基本操作。
循环链表的特点和应用。
2、栈和队列的实现栈的后进先出特性,实现入栈和出栈操作。
队列的先进先出原则,完成入队和出队功能。
3、树的操作二叉树的创建、遍历(前序、中序、后序)。
二叉搜索树的插入、查找和删除操作。
4、图的表示与遍历邻接矩阵和邻接表表示图。
深度优先搜索和广度优先搜索算法的实现。
四、实验步骤及结果1、链表的实现与操作单向链表:首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。
通过创建链表头节点,并使用循环依次插入新节点,实现了链表的创建。
插入节点时,根据指定位置找到插入点的前一个节点,然后修改指针完成插入操作。
删除节点时,同样找到要删除节点的前一个节点,修改指针完成删除。
实验结果:成功创建、插入和删除了单向链表的节点,并正确输出了链表的内容。
双向链表:双向链表节点结构体增加了指向前一个节点的指针。
创建、插入和删除操作需要同时维护前后两个方向的指针。
实验结果:双向链表的各项操作均正常,能够双向遍历链表。
循环链表:使链表的尾节点指向头节点,形成循环。
在操作时需要特别注意循环的边界条件。
实验结果:成功实现了循环链表的创建和遍历。
2、栈和队列的实现栈:使用数组或链表来实现栈。
入栈操作将元素添加到栈顶,出栈操作取出栈顶元素。
实验结果:能够正确进行入栈和出栈操作,验证了栈的后进先出特性。
数据结构实验报告
编号:江西理工大学数据结构课程设计报告班级:***********学号:09姓名:******时间:2012年12月31日~2012年1月11日指导教师:*************2013年01月目录第一章数制转换 (1)一、需求分析 (1)1、输入的形式和输入值的范围 (1)2、输出的形式 (1)3、程序所能达到的功能 (1)4、测试数据 (1)二、概要设计 (2)1、抽象数据类型的定义 (2)2、主程序的流程以及各程序模块之间的层次调用关系 (2)三、详细设计 (2)1、数据类型 (2)2、伪码算法 (3)3、流程图 (5)4、调试分析 (6)5、用户使用说明 (6)6、测试结果 (7)7、附录 (8)第二章一元多项式 (11)一、需求分析 (11)1、输入的形式和输入值的范围 (11)2、输出的形式 (11)3、程序所能达到的功能 (11)4、测试数据 (12)二、概要设计 (12)1、抽象数据类型的定义 (12)2、主程序的流程以及各程序模块之间的层次调用关系 (13)三、详细设计 (13)1、数据类型 (13)2、伪码算法 (14)3、流程图 (17)4、调试分析 (18)5、用户使用说明 (18)6、测试结果 (19)7、附录 (20)第一章数制转换一、需求分析1、输入的形式和输入值的范围n和f的输入形式均为int型,n和f的输入范围均为1~327672、输出的形式十六进制10-15输出A-E,超过十六进制时按16以上数值按原值输出。
3、程序所能达到的功能把十进制数n转换成任意进制数f(对于输入的任意一个非负十进制整数,输出与其等值的任意进制数(如二,四,八,十六进制)。
4、测试数据二、概要设计1、抽象数据类型的定义ADT Stack{基本操作:InitStack(&S)操作结果:构造一个空栈s。
Push(&S,e)初始条件:栈s已存在。
操作结果:插入元素e为新的栈顶元素。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告专业_____________年级_____________学号_____________学生姓名_____________指导老师_____________华中师范大学信息管理系编I 实验要求1.每次实验中有若干习题,每个学生至少应该完成其中的两道习题。
2.上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率。
3.独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。
4.上机结束后,应整理出实验报告。
书写实验报告时,重点放在调试过程和小节部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力的目的。
II 实验内容实验一线性表【实验目的】1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。
2.通过编程、上机调试,进一步理解线性表的基本概念,熟练运用C语言实现线性表基本操作。
3.熟练掌握线性表的综合应用问题。
【实验内容】1.一个线性表有n个元素(n<MAXSIZE, MAXSIZE指线性表的最大长度),且递增有。
现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。
设计程序实现。
要求:采用顺序存储表示实现;采用链式存储表示方法实现;比较两种方法的优劣。
2. 从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。
要求:①指定的值x由键盘输入;②程序能处理空链表的情况。
3.设有头结点的单链表,编程对表中的作一值只保留一个结点,删除其余值相同的结点。
要求:①该算法用函数(非主函数)实现;②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。
4.已知非空单链表第一个结点由head指出,请写一算法,交换p所指结点与其下一个结点在链表中的位置。
要求:①该算法用函数Reverse(head,p)实现,其中head为表头指针,p指向要交换的结点;②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。
5.设有一个单链表,编写能够完成下列功能的算法:①找出最小值的结点,且打印该数值;②若该数值是奇数,则将其与直接后继结点交换;③若该数值是偶数,则将其直接后继结点删除。
要求:编写主函数验证算法的正确性。
6.在一链表中,已知每个结点含有三个域:data、next和prior,其中prior域为空,设计一个算法,使每个结点的prior指向它的前驱结点,形成双向循环链表。
要求:①建立一个结点中含有三个域的单链表;②在主函数中调用此算法,构成双向循环链表;③在主函数中利用正向和逆向两种方式输出链表中的数据,验证算法的正确性。
7.用链表建立通讯录。
通讯录内容有:姓名、通讯地址、电话号码。
要求:①通讯录是按姓名项的字母顺序排列的;②能查找通讯录中某人的信息;提示:可用链表来存放这个通讯录,一个人的信息作为一个结点。
成链的过程可以这样考虑:先把头结点后面的第一个数据元素结点作为链中的首结点,也是末结点。
从第二个数据开始逐一作为‘工作结点’,需从链表的首结点开始比较,如果‘工作结点’的数据比链中的‘当前结点’的数据小,就插在其前面。
否则,再看后面是否还有结点,若没有结点了就插在其后面成为末结点;若后面还有结点,再与后面的结点逐一比较处理。
【实验报告】实验二堆栈与队列【实验目的】1.学习如何使用C语言实现堆栈与队列。
2.熟悉堆栈与队列的基本操作及应用。
【实验内容】1.现有一顺序循环队列,其结构描述为:# define MAX 100typedef struct{ ElemType queue[MaxQueueSize];int front; // 队头指针int count; // 计数器}QueueType;要求:①设计队列的几种几种操作:初始化、进队、出队、取队头元素和判断队列是否非空。
②编写一个主函数进行测试。
2.已知Q是一个非空队列,S是一个空栈。
编写算法实现:将队列Q中的所有元素逆置。
要求:①调用堆栈和队列的操作函数实现该算法。
②编写一个主函数进行测试。
3.设计一个算法,将计算机产生的n个随机数分为奇数、偶数两组,并将它们分别压入两个栈中,然后在屏幕上输出。
4.编写一个程序,反映病人到医院看病排队看医生的情况。
在病人排队过程中,主要重复两件事:①病人到达诊室,将病历交给护士,排到等候队列中候诊。
②护士从等待队列中取出下一个病人的病历,该病人进入诊室就诊。
要求模拟病人等待就诊这一过程。
程序采用菜单方式,其选项及功能说明如下:①排队──输入排队病人的病历号,加入到病人排队队列中;②就诊──病人排队队列中最前面的病人就诊,并将其从候诊队列中删除;③查看排队──从队首到队尾列出所有的排队病人的病历号;④不再排队,余下依次就诊──从队首到队尾列出所有的排队病人的病历号,并退出运行;⑤下班──退出运行。
【实验报告】实验三串【实验目的】1.掌握串的基本运算。
2.掌握有关串的比较、复制和转换等操作的实现。
3.熟悉串的有关应用问题。
【实验内容】1.设计一个算法,统计输入字符串中各个不同字符出现的频度。
设字符串中的合法字符为‘A’~‘Z’这26个字母和‘0’~‘9’这10个数字(串的存储结构自行选择)。
2.已知字符串S1中存放一段英文,写出算法format(S1,S2,S3,n),将其按给定的长度n格式化成两端对齐的字符串S2,其多余的字符送S3(即将字符串S1拆分成字符串S2和字符串S3,要求字符串S2长度为n且首尾字符不得为空格字符)。
3.输入一篇短文,统计其中所出现的单词的频率(单词间以空格隔开)。
4.采用动态顺序结构存储串,编写算法:求用户输入串S中出现的第一个最长重复子串的下标和长度。
一个字符串中重复最长的部分,比如说有如下字符串:abcdbcdbcb对于这个字符串最长的重复子串为bcdbc。
【实验报告】实验四数组【实验目的】1.进一步熟悉关于数组的压缩存储的有关概念。
2.掌握数组在压缩存储下的有关运算。
【实验内容】1.如果矩阵A中存在这样一个元素A[i][j]满足下列条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。
编写算法计算m×n的矩阵A的所有马鞍点。
2.设矩阵A、B和C均为采用压缩存储方式存储的n阶上三角矩阵,矩阵元素为整数类型,要求:①设计算法实现矩阵相加运算:C=A+B;②设计算法实现矩阵相乘运算:C=A×B;③在主函数中设定矩阵A和B,并调用该算法验证其正确性。
3.编写一个算法,对一个n×n矩阵,通过行变换,使其每行元素的平均值按递增顺序排列。
【实验报告】实验五二叉树【实验目的】1.理解和掌握二叉树的定义、性质、存储结构、遍历原理与实现方法。
1.建立二叉树并对其进行简单操作。
2.进一步熟悉二叉树的应用。
【实验内容】1.设计算法实现以下操作:①建立一棵二叉树(二叉树中的结点的数据为字符型);②统计二叉树中的结点数;③统计二叉树中叶子数;④输出所有的叶子结点;⑤输出所有从叶子结点到根结点的路径。
2.单词排序试将一段英文中出现的单词按词典的顺序打印出来,同时应注明每个单词在该段文章中出现的次数。
提示:将一段英文中出现的单词按词典的顺序打印的过程,就是由一个无序序列构造为有序序列的过程,这个过程可以通过构造二叉排序树,并按中序遍历来实现。
3.编写一个算法,判断以二叉链表存储的二叉树中否为完全二叉树,并用主函数进行测试。
4.已知在以二叉链表存储的二叉树BT中,p和q指向二叉树中两个不同的结点,试编写一算法,求包含p和q所指结点的最小子树。
5.若二叉树以三叉链表作为其存储结构,编写一个不设堆栈进行中序遍历的非递归算法。
【实验报告】实验六查找与排序【实验目的】1.进一步熟悉各种查找与排序的算法,并对各种算法的效率进行比较和测试。
【实验内容】1.排序算法比较。
要求:①调用函数int rand(void)产生个待排序的数据;②测试下列各排序函数的机器实际执行时间:a.直接插入排序;b.希尔排序c.选择排序d.冒泡排序e.堆排序f.快速排序g.归并排序 h.基数排序2.编写一个程序读入一个字符串,统计该字符串中出现的字符及其次数,然后输出结果。
要求用一个二叉树保存处理结果,字符串中的每个不同字符用树中结点描述,每个结点包含四个域:字符该字符出现的次数指向ASCII码小于该字符的左子树的指针指向ASCII码大于该字符的右子树的指针3.编写判定给定的二叉树是否是二叉排序树的算法。
并用主函数进行验证。
4.编写一个非递归的快速排序算法。
并用主函数进行验证。
【实验报告】实验七综合练习【实验目的】1.在掌握基本概念的基础上,综合运用线性结构和树结构以及排序和查找算法进行复杂结构程序设计。
【实验内容】1.试将一棵普通树转换成二叉树,同时转换而成的二叉树按前序、中序、后序进行遍历,并输出遍历后结点的序列。
例如,下面左图是一棵普通树,用括号表示法表示为:A(BC(FG)DE),右图是转换后的二叉树。
提示:从分析输入的树串形式可知,左括号后面的字符为左括号前面字符的左子树,括号内的字符关系是兄弟,则转化为二叉树后,后面字符为其前一字符的右子树。
所以,依据左右括号及字符间的关系,可以生成结点的左右子树。
2.建立学生成绩管理系统,要求:数据用线性表的链式存贮,并给出菜单界面。
系统中功能包括:①录入数据。
②给出学号,删除该学生的数据。
③给出学号,查询该学生的数据,并打印查询结果。
④以学生成绩为基础,对学生数据按降序排序,并输出排序结果。
⑤插入新的学生数据,并保持降序不变。
⑥打印排好序之后的学生数据。
【实验报告】实验报告的规范1.需求分析:以无歧义的陈述说明程序设计的任务,强调程序要做什么?明确规定:①输入的形式和输入值的范围;②输出的形式;③程序所能达到的功能;④测试数据:合法数据和非法数据及结果。
2.总体设计:说明本程序中用到的所有数据类型的定义、程序的总体框架。
3.详细设计:实现总体设计中定义的所有数据类型,对每个操作写出伪码算法或画出算法流程图,并画出模块的调用关系图。
4.调试分析:调试过程中遇到问题的解决办法以及对设计与实现的回顾讨论和分析;算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想等。
5.用户使用说明:说明程序的使用方法,详细列出每一步的操作步骤。
6.测试结果:列出测试结果,包括输入和输出,测试数据应该完整和严格。
7.附录:打印出带汁释的源程序。