数据结构实验一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
实验一
班级:06111504
学号:**********
**:***
1.实验题目:
采用单向环表实现约瑟夫环。
请按以下要求编程实现:
①从键盘输入整数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。2.源代码:
#include
#include
typedef struct list
{ int num;
struct list * next;
}list,* plist;
plist h,p,q;
void Create(int n)
{
h=(plist)malloc(sizeof(list));
h->next=NULL; h->num=0;
while(--n)
{
p=(plist)malloc(sizeof(list));
p->num=n;
p->next=h->next;
h->next=p;
}
while (p->next)
p=p->next;
p->next=h->next; }
void Find(int m,int s)
{
p=h;
while(p->num!=s)
p=p->next;
}
void OutNum(int n)
{
while(p->next!=p)
{
for(int i=1;i p=p->next; q=p->next; printf("%-4d",p->next->num); p->next=q->next; p=p->next; free(q); } printf("%-4d\n",p->num); } int main() { int m,s,n; scanf("%d%d%d",&m,&s,&n); Create(m+1); Find(m,s); OutNum(n); } 3.运行结果截屏: 4.编写与调试过程中遇到的问题: 在编写的过程中,首先遇到的困难是如何把算法转化为一个c语言程序,对于链表的操作,自己已经搞忘的差不多了,编写的时候对于如何实现一个环形链表,自己刚开始时有些不知所措,后来在同学的指导下,有了思路。还有就是对于把算法转化为程序的步骤,自己还要加强。还有就是自己编写程序时,粗心大意,总是忘记加一些符号。比如第一次调试的时候,出现了这样的错误。 后来才发现,少加了一个大括号,以后这种情况要少出现。 1.实验题目: 归并顺序表(选作)。 请按以下要求编程实现: ①从键盘输入两个升序排列的整数序列linka和linkb,每个序列以输入0 为结束标记。 ②将链表linka和linkb归并为linkc,linkc仍然为升序排列。归并完成后, linka和linkb为空表。输出linkc。 ③对linkc进行处理,保持升序不变,删除其中重复的整数,对重复的整数 只保留一个,输出删除重复整数后的链表。 例如:linka输入为:10 20 30 40 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 2.源代码: #include #include typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; void Creat(LinkList &L); void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc); void Delete(LinkList &L); void Output(LinkList &L); int main() { LinkList La,Lb,Lc; Creat(La); Creat(Lb); MergeList(La,Lb,Lc); free(La); free(Lb); Delete(Lc); Output(Lc); } void Creat(LinkList &L) { LinkList p,q; int num; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; p=L; scanf("%d",&num); while(num!=0) { q=(LinkList)malloc(sizeof(LNode)); q->data=num; q->next=p->next; p->next=q; p=q; scanf("%d",&num); } } void MergeList(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;