9.16作业

用循环列表变成实现约瑟夫问题:

#ifndef __1_H__
#define __1_H__


typedef  int  datatype;
typedef struct Node
{
	union 
	{
		int len;
		datatype data;
	};
	struct Node *prio;
	struct Node *next;
}Node,*double_list;
//创建
double_list list_create();
//数据空间申请与封装
double_list make_code(datatype g);
//判空
int list_empty(double_list p);
//尾插
void list_tail_insert(double_list p,datatype g);
//根据输入终端输入确定链表
void list_pc_in(double_list p,int g);
//输出链表内容带头
void list_out(double_list p);
//删除头
double_list list_nohead(double_list p);
//根据要求循环遍历无头链表
void list_nohead_out(double_list H,int N,int M);
#endif
//************************************************************************************
#include <stdio.h>
#include"1.h"
#include<stdlib.h>
double_list list_create()
	{
		double_list p=(double_list)malloc(sizeof(Node));
		if(p==NULL)
			{
				printf("创建失败\n");
				return 0;
			}
		p->len=0;
		p->prio=p;
		p->next=p;
		printf("创建成功\n");
		return p;
	}
double_list make_code(datatype g)
{
	double_list p=(double_list)malloc(sizeof(Node));
	if(p==NULL)
	{
		printf("创建失败\n");
		return 0;
	}
	p->data=g;
	p->prio=p;
	p->next=p;
	printf("创建成功\n");
	return p;
}
int list_empty(double_list p)
		{
		return p->next==p?1:0;
		}
void list_tail_insert(double_list p,datatype g)
		{
			if(p==NULL)
			{
			printf("地址不合法\n");
			return;
			}
		double_list p1=make_code(g);
		double_list k=p->next;
			if(list_empty(p))
				{
				p1->next=p;
				p1->prio=p;
				p->next=p1;
				p->prio=p1;
				p->len++;
				printf("插入成功\n");
					return;
				}
			while(k->next!=p)
			{
				k=k->next;
			}
			p1->prio=k;
			p1->next=p;
			k->next=p1;
			p->prio=p1;
			p->len++;
			printf("插入成功\n");
			return;
		}
void list_pc_in(double_list p,int g)
		{
			for(int i=1;i<=g;i++)
				{
					list_tail_insert(p,i);
				}
		}
void list_out(double_list p)
{
	if(p==NULL||list_empty(p))
	{
		printf("非法输出\n");
		return;
	}
	double_list p1=p->next;
	printf("输出链表为:");
	while(p1!=p)
	{
		printf("%d ",p1->data);
		p1=p1->next;
	}
	putchar(10);
}
double_list list_nohead(double_list p)
		{
			if(p==NULL)
			{
			printf("非法操作\n");
			return 0;
			}
			if(list_empty(p))
			{
			printf("链表除头无其他值\n");
			return NULL;
			}
			double_list p1=p->next;
			while(p1->next!=p)
			{
				p1=p1->next;
			}
			p1->next=p->next;
			p->next->prio=p->prio;
			double_list H=p->next;
			p->next=p;  //将头初始化,留作后面当做输出链表的头
			p->prio=p;
			p->len=0;
			printf("删除头文件成功\n");
			return H;
		}
void list_nohead_out(double_list H,int N,int M)
{

	int a=N;
	int count=1;
	int j=0;
	double_list U=list_create();
	double_list k=H;
	double_list J;
	while(1)
	{
		if(count %a==0)
		{
			k->prio->next=k->next;
			k->next->prio=k->prio;
			J=k->prio;
			k->next=k;
			k->prio=k;
			list_tail_insert(U,k->data);
			if(U->len==M)
			{
				list_out(U);
				break;
			}
			k=J;
		}
		k=k->next;
		count++;
	}
}
//************************************************************************************
#include <stdio.h>
#include"1.h"
#include<stdlib.h>
int M;
int main(int argc, const char *argv[])
{
	double_list p;
	double_list H=NULL;
	int N;
	while(1)
	{
		printf("\t\t****功能菜单****\t\t\n");
		printf("\t1.创建\t\t\t2.输入长度\n");
		printf("\t3.输出\t\t\t4.实现功能\n");
		int get;
		printf("请选择功能:");
		scanf("%d",&get);
		switch(get)
		{
		case 1:                         //先选功能1,再选2,在2中输入想要的链表长度,3是输出列表可选可不选,最后选4,输入每多少位删除一个同时输出出来.
			p=list_create();break;     
	
		case 2:
			printf("请输入长度:\n");
			scanf("%d",&M);
			list_pc_in(p,M);
			break;
		case 3:
			list_out(p);
			break;
		case 4:
			H=list_nohead(p);
			printf("请输入删除位序:");
			scanf("%d",&N);
			list_nohead_out(H,N,M);
			break;	
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值