数据结构线性表练习题之二

    xiaoxiao2023-10-25  163

    使用顺序结构完成约瑟夫问题

    //关键代码 index = (index + m - 1) % L->length; #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MAXSIZE 10 //顺序存储结构 模仿数组的相关操作 typedef int DataType; typedef struct { DataType data[MAXSIZE]; int length; }SqList; void InitSqList(SqList *L); void ShowSqList(SqList *L); void Josephus(SqList *L,int m,int k); void DeleteSqList(SqList *L,int index); void main() { SqList L;//构建一个长度为10的顺序表 InitSqList(&L);//初始化顺序表 ShowSqList(&L); Josephus(&L,4,3); } void InitSqList(SqList * L) { int i = 0; L->length = MAXSIZE; for(i = 0;i < L->length;i++)//将线性表的元素从1设置到10 { L->data[i] = i + 1; } } void Josephus(SqList *L,int m,int k) { int i,j,s; int index; //先找到第一个喊话的人的下标 for(i = 0;i < k;i++); index = i - 1;//第一个喊话的是下标为1的人 //printf("%d",index); while(L->length != 1) { index = (index + m - 1) % L->length; /*s = index; for(j = s;j < s + m;j++) { if(j == L->length - 1) //说明已经喊话到了最后一个人 需要从头继续喊话 { index = 0; peop++; break; } else { index = j; peop++; } if(peop == 3) { } }*/ /*for(peop;peop < m;peop++) { index++; }*/ //删除下标是index2的元素 /* printf("%d号淘汰!\n",L->data[index]); DeleteSqList(&L,index); peop = 0;*/ printf("%d号淘汰!\n",L->data[index]); DeleteSqList(L,index); } printf("\n%d号胜出!",L->data[0]); } void ShowSqList(SqList *L) { int i; for(i = 0; i < L->length;i++) { printf("%d\t",L->data[i]); } printf("\n"); } void DeleteSqList(SqList *L,int index) { int j; int local = index + 1; //删除的位置 if(L->length == 0) { printf("顺序表为空,删除失败!"); } if(local < 1 || local > L->length) { printf("删除位置不合法!"); exit(1); } //删除的思路是将要删除位置后面的元素依次向前移动 并且将数组长度-1 for(j = local;j < L->length;j++) { L->data[j-1] = L->data[j]; } L->length--; }
    最新回复(0)