线性表(约瑟夫问题、有序表合并)数据结构实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验线性表
姓名:班级:
学号:实验时间:
一、约瑟夫问题
1.问题描述
设有编号为1,2,...,n(n>0)的n个人围成一圈,从约定编号k(1≤k≤n)开始报数,报到m的人出圈,然后从他的下一位开始新一轮报数。如此反复下去,直至所有人出圈。当任意给定n和m时,设计算法求n个人出圈的次序。
2.数据结构设计
采用循环单链表,可建立如下的结构体:
struct Node
{
int data;
Node *next;
};
3.功能划分及算法设计
规定的主要功能有创建无头节点的循环单链表、节点的删除与输出。
(1)创建无头节点的循环单链表(尾插法)
p=new Node;
p->next=p;
p->data=1;
for(int i=2;i<=n;i++)
{
s=new Node;//新建元素结点
s->data=i;//输入新建数据元素值
s->next=p->next;//新结点链入表尾
p->next=s;
p=s;
}
(2)节点的删除与输出
Node *Delete_Print(Node *p,Node *pre)//删除、输出函数
{
Node *q;
cout<
while(p->next!=pre)//p定位到删除点的前驱
{
p=p->next;//
}
{
q=p->next;// 暂存删除结点位置
p->next=q->next;//从链表中摘除删除结点
delete q;// 释放删除点
return p->next;
}
}
4.运行与测试
(1)运行程序,提示输入n,m,k,如图所示:
(2)分别输入7、5、1,结果如下:
5.调试记录及收获
调试过程中经常会遇到与预计的删除节点偏差1-2个节点的情况,主要原因是:(1)链表创建完成后指针P未归位
(2)删除节点后指针P任然停留在原节点的前驱
(3)循环操作时计数器重置数设置错误
通过本次实验掌握并练习了循环单链表的创建与部分操作,进一步加深对单链表的认识,提高了实践操作水平。
6.源程序
#include
struct Node
{
int data;
Node *next;
};
Node *Delete_Print(Node *p,Node *pre)//删除、输出函数
{
Node *q;
cout<
while(p->next!=pre)//p定位到删除点的前驱
{
p=p->next;//
}
{
q=p->next;// 暂存删除结点位置
p->next=q->next;//从链表中摘除删除结点
delete q;// 释放删除点
return p->next;
}
}
void main()
{
Node *p,*s,*pre;
int m,n,k;
cout<<"请依次输入人数n,密码m,起报人数k"< cin>>n>>m>>k; //创建循环单链表(尾插法) p=new Node; p->next=p; p->data=1; for(int i=2;i<=n;i++) { s=new Node;//新建元素结点 s->data=i;//输入新建数据元素值 s->next=p->next;//新结点链入表尾 p->next=s; p=s; } //初始化 p=p->next; i=1; while(i<=k){ pre=p; p=p->next ; i++; }//定位起报人 int count=2; while(pre!=p){ if(count==m) { p=Delete_Print(p,p); count=1;//计数器重置 } else{ count++; pre=p; p=p->next; } } Delete_Print(p,p);//删除并输出最后一个节点 } 二、有序表合并 1.问题描述 把两个有序表归为一个有序表 2.数据结构设计 采用单链表存储两个有序表,合并后的表采用带头结点的单链表存储。 struct Node { int data;//数据域,存放表元素 Node* next;//指针域,指向下一个结点 }; 3.算法设计 规定的主要功能有创建有序顺序表的函数,实现归并功能的函数、显示表内容的函数。(1)创建单链表 Node* CreateList() { Node* Head; Head = new Node; Head->next = NULL; return Head; } (2)键盘输入有序单链表 void CinList(Node *Head) { Node *p = Head,*s; int n; cout << "请输入元素个数:"; cin >> n; cout << "请按序输入有序表的元素:" << endl; for (int i = 1; i <= n; i++) { s = new Node;//新建元素结点 cin >> s->data;//输入新建数据元素值 s->next = p->next;//新结点链入表尾 p->next = s; p = s;