数据结构实验一:约瑟夫问题

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值