#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
typedef struct SeqList//创建单链表
{
int data;
SeqList *next;
}SeqList , *LinkList;
LinkList Init_list();//初始化单链表
int delete_list(LinkList L, int i,int k);//删除元素
void Output(LinkList L);//输出单链表
LinkList Read();//读取文件数据
int josephus_LinkList(LinkList josephus_Link, int s, int m);
//主函数调控
int main()
{
int s, m=0;
LinkList list;
list = Init_list(); //初始化单链表
printf("当前序列为:");
while (m < 10)
{
printf("%d ", list->data);
list = list->next;
m++;
}
printf("\n请输入起始位置s和距离m:\n\t\t\ts = ");
scanf("%d", &s);
printf("\t\t\tm = ");
scanf("%d", &m);
if (m == 0)
{
printf("\t\t\t抱歉,您的输入数据不合法\n");
return 0;
}
josephus_LinkList(list, s, m);//问题求解
return 0;
}
//初始化链表
LinkList Init_list()
{
LinkList L,p,q;
L = (LinkList)malloc(sizeof(SeqList));
if (L)
L->next = NULL;
else
{
printf("创建失败");
exit(0);
}
p = L;
FILE* fp; //生成一个指向文件的指针
int i = 0;
fp = fopen("D:\\testexample\\9.16.txt", "r");
if (fp == NULL) //判断指针是否成功指向文件,否则返回空
{
printf("ERROR");
return NULL;
}
while (fscanf(fp, "%d", &i) != EOF)
{
q = (LinkList)malloc(sizeof(SeqList));
q->data = i;
p->next= q;
p = q;
}
fclose(fp); //操作完成记得关闭文件
L = L->next;//跳过一个空值
p->next = L;
return(L);
}
int josephus_LinkList(LinkList josephus_Link, int s, int m)
{ /*求约瑟夫问题的出列元素序列,入口参数:已经存放数据的链表头指针的地址,起始位置s,数m ,出口参数:1表示成功,0表示表中没有元素*/
LinkList p, pre; /*p指向当前结点,pre指向其前驱结点*/
int count;
pre = (LinkList)malloc(sizeof(SeqList));
if (!josephus_Link)
{
printf("表中无元素");
return (0);
}
p = josephus_Link;
for (count = 1; count < s; count++) /*查找第s个结点,用p作为第s个结点的指针*/
p = p->next;
printf("输出约瑟夫序列:");
while (p != p->next) /*输出 n-1个元素个结点*/
{
for (count = 1; count < m; count++)
{
pre = p;
p = p->next;
}
printf("%d\t", p->data);
pre->next = p->next;
free(p);
p = pre->next;
}
printf("%d\t", p->data); /*输出最后一个元素个结点*/
free(p);
return 1;
}
数据结构实验一:约瑟夫问题
最新推荐文章于 2024-10-15 18:50:01 发布