利用链表解决约瑟夫问题

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

三、实验结果:

四、结果分析:

运算结果完全正确。

相关文档
最新文档