链表颠倒,链表循环约瑟夫问题

#define N 3//容量
#define n 10//数组数
#define random (srand((unsigned)time(NULL)))//添加随机数据


//						主 函 数
typedef int datatype;
typedef struct Link
{
	struct data
	{
		datatype arr[N];
		int L;
	}data;

	struct Link* next;
}link;


link *creatlink(void);
void showlink(link *p0);
void updownlink(link *p0);
void josephlink(link *p0);
void Adeletegoal(link *p0);
//void Bdeletegoal(link* p0,int x);

//								主 函 数
int main()
{
	link* p0;
	while(!0)
	{
		p0 = creatlink();
		showlink(p0);

		/*updownlink(p0);
		showlink(p0);*/

		/*deletegoal(p0);
		showlink(p0);*/
	
		
		josephlink(p0);
		
		break;
	}
	return 0;
}

//							初 始 化 接 头 插
link* creatlink(void)
{
	random;
	link* Head = (link*)malloc(sizeof(link));
	if (Head == NULL) return NULL;
	Head->next = NULL;
	Head->data.L = 0;

	printf("\n正在初始化......\n");
	for(int i = 0; i < n; i++)
	{
		link* q = Head, * p = (link*)malloc(sizeof(link));
		p->next = NULL;
		if (p == NULL) return NULL;
		for (int j = 0; j < N; j++)
		{
			p->data.arr[j] = (rand() % 100);
		}
		p->next = q->next;
		q->next = p;
		q = p;
		Head->data.L++;
	}

	return Head;
}

//						打 印 数 组
void showlink(link* p0)
{
	printf("\n-------------------\n打印数据如下:\n");
	link* p = p0->next;
	int serial = 0;
	while (p != NULL)
	{
		printf("序号:%d\t",serial++);
		
		for(int i = 0; i < N;i++)
		{
			printf("%d ",p->data.arr[i]);
		}
		printf("\n");
		p = p->next;
	}
	printf("  数组数:%d\n", p0->data.L);
	return;
}


//								颠 倒 数 组
void updownlink(link* p0)
{
	link* p = p0,*q = p0->next;

	p0->next = NULL;

	for(int i = 0; i < p0->data.L; i++)
	{
		p = q->next;
		q->next = p0->next;
		p0->next = q;
		q = p;
	}
	return;
}

//							需要传给参数指定删除
void Bdeletegoal(link* p0, int x)
{
	if (p0->data.L > 0)
	{
		link* p = p0, * storage;

		if (x >= 0 && x <= p0->data.L)
		{
			for (int i = 0; i < x; i++)
			{
				p = p->next;
			}
			storage = p->next;
			p->next = storage->next;
			p0->data.L--;

			printf("%d\n",storage->data.arr[1]);
			free(storage);
			storage = NULL;
			//printf("%d\n",p->data.arr[1]);//验证
		}

	}
	return;
}

//							约瑟夫问题

void josephlink(link* p0)
{
	link* p = p0->next, * storage1, * storage2;
	//printf("%d\n", p->data.arr[1]);
	storage1 = p0->next;
	storage1->data.L = p0->data.L;
	while (p->next != NULL) p = p->next;
	//printf("%d\n",p->data.arr[1]);
	p->next = p0->next;
	//printf("%d\n", p->next->data.arr[1]);



	int k, m, i, j, o;
	printf("从序号k开始,数到m的数组出列!\n请输入k和m(m>=1):\n");
	scanf("%d %d", &k, &m);
	if (k >= 0 && k < n && m >= 2)
	{
		for (i = 0; i <= k; i++)
		{
			p = p->next;
		}
		//printf("%d\n",p->data.arr[1]);

		for (i = 0; p0->data.L != 0; i++, p0->data.L--)
		{

			for (j = 0; j < m - 2; j++)
			{
				p = p->next;
			}
			//printf("%d\n",p->data.arr[1]);

			storage2 = p->next;
			/*printf("%d ", storage2->data.arr[1]);
			break;*/
			p->next = storage2->next;

			for (o = 0; o < N; o++)
			{
				printf("%d ", storage2->data.arr[o]);
			}
			printf("\n第%d个出列\n", i + 1);
			/*printf("%d ", storage2->data.arr[1]);
			break;*/
			free(storage2);

			p = p->next;

		}
		printf("现有数组数:%d\n",p0->data.L);
	}
	else
	{
		printf("超出范围了哟!\n");
	}



	return;
}

//						终端输入指定位置删除
void Adeletegoal(link* p0)
{
	if (p0->data.L > 0)
	{
		link* p = p0,*storage;
		int x = 0;
		printf("请输入要删除的数组序号:\n");
		scanf("%d",&x);
		if(x >= 0 && x <= p0->data.L)
		{
			for (int i = 0; i < x; i++)
			{
				p = p->next;
			}
			storage = p->next;
			p->next = storage->next;
			p0->data.L--;
			
			free(storage);
			storage = NULL;
			//printf("%d\n",p->data.arr[1]);//验证
		}

	}
	return;
}

linux 打 印 现 象:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值