数据结构实验一
- 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 3040500 归并后的 linkc 为:10 15 2020253030354040 455050 删除重复后的 linkc 为: 101520253035404550 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;