当前位置:文档之家› 数据结构与算法设计实验一

数据结构与算法设计实验一

《数据结构与算法设计》实验报告——实验一学院:班级:学号:姓名:一、实验目的第一题利用单向环表实现约瑟夫环。

第二题归并顺序表。

二、实验内容第一题采用单向环表实现约瑟夫环。

请按以下要求编程实现:①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。

环表中的结点编号依次为1,2,……,m。

②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。

例如,m=10,s=3,n=4。

则输出序列为:6,10,4,9,5,2,1,3,8,7。

第二题选作:归并顺序表。

请按以下要求编程实现:①从键盘输入两个升序排列的整数序列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、概要设计第一题为了实现程序功能,应当建立单向环表来寄存信息及结点,通过查找结点来完成相应的操作。

顺序是:输入数据--建立头结点--建立环表--循环输出和删除结点。

程序流程第二题为了实现程序功能,应当建立单向链表来寄存信息及结点,顺序是:输入数据--建立头结点--建立链表--合并链表--输出链表--删除重复数据--输出链表。

程序流程2、详细设计第一题#include <stdio.h>#include <stdlib.h>//定义结构体typedef struct LNode {int data;struct LNode *next;}LNode,*LinkList;//创建具有m个结点的单向环表void Create(LinkList &l,int m){LinkList p;l=(LinkList)malloc(sizeof(LNode));l->next=NULL;l->data=1;for(int i=m;i>1;i--){p=(LinkList)malloc(sizeof(LNode));p->data=i;if(i==m) p->next=l;else p->next=l->next;l->next=p;}}//主函数int main (){int m,s,n,i;LNode *l,*p,*q;printf("请输入m s n\n");scanf("%d %d %d",&m,&s,&n);Create(l,m);for(i=1,p=l;i<s;i++)//寻找起始结点sp=p->next;while (m--){for(i=1;i<n-1;i++) //计数到第n个结点时,输出该第n结点对应的编号p=p->next;q=p->next;printf("%d ",q->data);p->next=q->next; //将该结点从环表中消除p=p->next;free(q);}return 0;}第二题#include <stdio.h>#include <stdlib.h>typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;//从键盘输入升序排列的整数序列,序列以输入0为结束标记。

void create(LinkList &head){LinkList p,q;int n;head=(LinkList)malloc(sizeof(LNode));head->next=NULL;scanf("%d",&n);p=(LinkList)malloc(sizeof(LNode));p=head;while(n!=0){q=(LinkList)malloc(sizeof(LNode));q->data=n;q->next=p->next;p->next=q;p=q;scanf("%d",&n);}}//将链表La和Lb归并为Lc,Lc仍然为升序排列void paixu(LinkList &La,LinkList &Lb,LinkList &Lc){ LinkList pa,pb,pc,p,q;pa=La->next; pb=Lb->next;Lc=(LinkList)malloc(sizeof(LNode));Lc->next=NULL;pc=Lc;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;}//对c进行处理,保持升序不变,删除其中重复的整数,对重复的整数保留一个void shanchu(LinkList &c){LinkList p,q;p=(LinkList)malloc(sizeof(LNode));q=(LinkList)malloc(sizeof(LNode));p=c->next;while(p->next!=NULL){if(p->data==p->next->data){q=p->next;p->next=q->next;}else p=p->next;}}//输出链表cvoid output(LinkList &c){LinkList p;p=(LinkList)malloc(sizeof(LNode));p=c->next;while(p->next!=NULL){printf("%d ",p->data);p=p->next;}printf("%d\n",p->data);}//主函数int main(){ LNode *a,*b,*c;printf("请输入整数序列linka:\n");create(a);printf("请输入整数序列linkb:\n");create(b);paixu(a,b,c);free(a); free(b); //归并完成后,a和b为空表output(c);shanchu(c);output(c);return 0;}四、程序调试分析第一题计数到第n个结点时应定位在n-1个节点,这样才能删除第n个节点。

第二题将链表a和链表b合并时易出错,需要理好关系,可以借助画图试思路更清晰。

体会当程序运行出现问题的时候,一定要仔细一步步去调试,很有可能一个很小的漏洞就导致整个程序的错误。

五、程序运行结果与分析第一题测试用例1输入:10 5 4输出:8 2 6 1 7 4 3 5 10 9测试用例2输入:15 3 4输出:6 10 14 3 8 13 4 11 2 12 7 5 9 1 15第二题测试用例1输入:10 20 30 40 010 15 20 25 30 0输出:10 10 15 20 20 25 30 30 4010 15 20 25 30 40测试用例2输入:100 200 300 400 0150 200 300 350 400 0输出:100 150 200 200 300 300 350 400 400100 150 200 300 350 400六、用户使用说明书第一题1、本程序的运行环境为Windows操作系统下的DEV c++。

2、在VC环境下打开程序后,按要求键入m,s,n的值,敲击“回车符”,即可以显示要求的结果。

第二题1、本程序的运行环境为Windows操作系统下的DEV c++。

2、在VC环境下打开程序后,从键盘输入两个升序排列的整数序列a和b,每个序列以输入0为结束标记,敲击“回车符”,即可以显示要求的结果。

七、程序清单第一题注释见程序详细设计。

第二题注释见程序详细设计。

相关主题