数据结构与算法设计实验一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法设计》
实验报告
——实验一
学院:
班级:
学号:
姓名:
一、实验目的
第一题利用单向环表实现约瑟夫环。
第二题归并顺序表。
二、实验内容
第一题采用单向环表实现约瑟夫环。
请按以下要求编程实现:
①从键盘输入整数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 0
linkb输入为: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
#include
//定义结构体
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
p=p->next;
while (m--){
for(i=1;i
q=p->next;
printf("%d ",q->data);
p->next=q->next; //将该结点从环表中消除
p=p->next;
free(q);
}
return 0;
}
第二题
#include
#include
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;
}