线性表(约瑟夫问题、有序表合并)数据结构实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<data<<" ";//输出需要删除的节点的数值

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//cout,cin

struct Node

{

int data;

Node *next;

};

Node *Delete_Print(Node *p,Node *pre)//删除、输出函数

{

Node *q;

cout<data<<" ";//输出需要删除的节点的数值

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;

相关文档
最新文档