利用链表解决约瑟夫问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山西大学计算机与信息技术学院
实验报告
姓名学号专业班级
课程名称数据结构实验日期2015.5.13
成绩指导教师批改日期实验名称
一、实验目的:
利用链表解决约瑟夫问题。
二、实验内容:
1、概要设计
使用CreateList函数创建一个线性链表,其中链表长度由输入数据指定,输入数据由自然数按顺序组成,其对应密码由时间随机给出。使用Length函数计算线性表长度。使用Locate函数顺序遍历线性链表并返回当前结点对应的密码。由Delete函数删除链表中指定结点。在主函数中依次调用,并根据数据关系,在主函数中写出如下函数体便可。
LinkList L;
int x,k,j;
printf("Please enter an integer to be SQList length ----\n ");
CreateList(L);
k=Length(L);
printf("Please enter an random number m ---- \n");
scanf("%d",&x);
while(k>0){
while(x>k)x=x-k;
j=Locate(L,x);
Delete(L,x);
x=j-k+x;
k=k-1;
if(x<=0)x=x+k;
2、详细设计
#include
#include
#include
#include
#include
const int MAX_N=100;
typedef struct LNode{
int data;
int password;
LNode *next;
}LNode, *LinkList;
int Length(LinkList L){
LNode *p=L; int j=0;
if(!p) {printf("No head node!\n"); return 0;}
while(p->next){p=p->next;j++;}
return j;
}
void CreateList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
srand((unsigned)time(NULL));
LNode *p=L, *s;
int j;
int x =1;
scanf("%d",&j);
while(x!=j){
s=(LinkList)malloc(sizeof(LNode));
if(!s) {printf("OVERFLOW!\n"); return;}
s->data=x;
s->password= rand()%j+1;
s->next=p->next;
p->next=s;
p=s; //设尾指针
x=x+1;
}
p=L->next;
printf("SQList element and password----- \n" );
while(p){printf("element:%3d password:%3d \n", p->data,p->password); p=p->next;} printf("\n");
return;
}
int Locate(LinkList L, int x){//带头结点
LNode* p=L; int j=0;
while(p&&(j!=x)) {p=p->next; j++;}
if(!p) {printf("(L)No such Element %4d\n", x); return 0;}
return p->password;
}
void Delete(LinkList L,int x){
LNode* p=L; int j=0;
while(p&&(j!=x-1)) {p=p->next; j++;}
if(!p) printf("(D)No such Element %4d\n", x);
printf("Delete number %d \n",p->next->data);
p->next=p->next->next;
}
int main(){
LinkList L;
int x,k,j;
printf("Please enter an integer to be SQList length ----\n ");
CreateList(L);
k=Length(L);
printf("Please enter an random number m ---- \n");
scanf("%d",&x);
while(k>0){
while(x>k)x=x-k;
j=Locate(L,x);
Delete(L,x);
x=j-k+x;
k=k-1;
if(x<=0)x=x+k;
}
printf("\Program ends!\n"); }
三、实验结果:
四、结果分析:
运算结果完全正确。