华清远见上海中心22071班 8.25作业

目录

1.用无头结点的循环链表实现约瑟夫环问题

头文件:

功能函数:

主函数:

终端输出:

2.顺序栈实现进制转换问题

头文件:

功能函数:

 主函数:

终端输出:


1.用无头结点的循环链表实现约瑟夫环问题

头文件:

#ifndef _ZY1_H
#define _ZY1_H

typedef int datatype;
typedef struct Node
{
	union{
		datatype data;
		int len;
	};
	struct Node *next;
}joseph;
//创建
joseph *ring_creat();
//判空
int empty(joseph *l);
//删除头结点
joseph *kill(joseph *l);
//插入
int insert(joseph *l,datatype e);
//约瑟夫环
int ring(joseph *h,int n,int m);
//删头后遍历
void show(joseph *h);
#endif

功能函数:

#include<stdio.h>
#include<stdlib.h>
#include"zy1.h"

joseph *ring_creat()
{
	joseph *l=(joseph*)malloc(sizeof(joseph));
	if(NULL==l)
	{
		printf("创建失败\n");
		return NULL;
	}
	l->len=0;
	l->next=l;
	printf("创建成功\n");
	return l;
}
int empty(joseph *l)
{
	return l->next==l?1:0;
}
joseph *kill(joseph *l)
{
	if(NULL==l)
	{
		free(l);
		l=NULL;
		return NULL;
	}
	joseph *p=l;
	while(p->next!=l)
	{
		p=p->next;
	}
	p->next=l->next;
	free(l);
	l=NULL;
	printf("删除成功\n");
	return p->next;
}
int insert(joseph *l,datatype e)
{
	if(NULL==l)
	{
		printf("插入失败\n");
		return -1;
	}
	joseph *p=(joseph*)malloc(sizeof(joseph));
	p->data=e;
	p->next=NULL;
	if(NULL==p)
	{
		printf("申请失败\n");
		return -2;
	}
	joseph *q=l;
	while(q->next!=l)
	{
		q=q->next;
	}
	p->next=l;
	q->next=p;
	l->len++;
	printf("插入成功\n");
	return 0;
}
int ring(joseph *l,int n,int m)
{
	joseph *p=l;
	printf("约瑟夫环实现:");
	for(int j=0;j<n;j++)
	{
		for(int i=0;i<m-2;i++)
		{
			p=p->next;
		}
		joseph *q=p->next;
		printf("%d\t",q->data);
		p->next=q->next;
		p=p->next;
		free(q);
		q=NULL;
	}	  
	printf("\n");
}
void show(joseph *h)
{
	if(h==NULL)
	{
		printf("遍历失败\n");
		return;
	}
	printf("删除头结点后:");
	joseph *q=h;
	do{
		printf("%d\t",q->data);
		q=q->next;
	}while(q!=h);
	printf("\n");
}

主函数:

#include"zy1.h"
#include <stdio.h>
int main(int argc, const char *argv[])
{
	joseph *l= ring_creat();
	insert(l,1);	
	insert(l,2);	
	insert(l,3);	
	insert(l,4);	
	insert(l,5);	
	insert(l,6);	
	insert(l,7);	
	insert(l,8);	
	joseph *h=kill(l);
	show(h);
	ring(h,8,4);
	return 0;
}

终端输出:

2.顺序栈实现进制转换问题

头文件:

#ifndef _ZY2_H
#define _ZY2_H
#define M 100
typedef int datatype;
typedef struct 
{
	datatype data[M];
	int top;
}trans;
//创建栈
trans *creat();
//判空
int empty(trans *s);
//判满
int full(trans *s);
//入栈
int push(trans *s,datatype e);
//出栈
int pop(trans *s);
//遍历
void show(trans *s);
//二进制转换
int transform_2(trans *s,int n);
//八进制转换
int transform_8(trans *s,int n);
//十六进制转换
int transform_16(trans *s,int n);
#endif

功能函数:

#include<stdio.h>
#include<stdlib.h>
#include"zy2.h"

trans *creat()
{
	trans *s=(trans*)malloc(sizeof(trans));
	if(NULL==s)
	{
		printf("创建失败\n");
		return NULL;
	}
	s->top=-1;
	printf("创建成功\n");
	return s;
}
int empty(trans *s)
{
	return s->top==-1?1:0;
}
int full(trans *s)
{
	return s->top==M-1?1:0;
}
int push(trans *s,datatype e)
{
	if(NULL==s||full(s))
	{
		printf("入栈失败\n");
		return -1;
	}
	s->top++;
	s->data[s->top]=e;
	printf("入栈成功\n");
	return 0;
}
int pop(trans *s)
{
	if(NULL==s||empty(s))
	{
		printf("出栈失败\n");
		return -1;
	}
	printf("%d出栈成功\n",s->data[s->top]);
	s->top--;
	return 0;
}void show(trans *s)
{
	if(NULL==s||empty(s))
	{
		return ;
	}
	printf("当前栈中从栈顶到栈底元素分别是:");
	for(int i=s->top;i>=0;i--)
	{
		printf("%d\t",s->data[i]);
	}
	printf("\n");
}
int transform_2(trans *s,int n)
{
	if(NULL==s)
	{
		printf("转换失败\n");
		return -1;
	}
	while(n/2!=0)
	{
		push(s,n%2);
		n=n/2;
	}
	push(s,n);
	printf("输出二进制:");
	show(s);
	s->top=-1;
	return 0;
}
int transform_8(trans *s,int n)
{
	if(NULL==s)
	{
		printf("转换失败\n");
		return -1;
	}
	while(n/8!=0)
	{
		push(s,n%8);
		n=n/8;
	}
	push(s,n);
	printf("输出八进制:");
	show(s);
	s->top=-1;
	return 0;
}
int transform_16(trans *s,int n)
{
	if(NULL==s)
	{
		printf("转换失败\n");
		return -1;
	}
	while(n/16!=0)
	{
		push(s,n%16);
		n=n/16;
	}
	push(s,n);
	printf("输出十六进制:");
	for(int i=s->top;i>=0;i--)
	{
		switch(s->data[i])
		{
			case 10:printf("A");break;
			case 11:printf("B");break;
			case 12:printf("C");break;
			case 13:printf("D");break;
			case 14:printf("E");break;
			case 15:printf("F");break;
			default:printf("%d",s->data[i]);
		}
	}
	printf("\n");
	s->top=-1;
	return 0;
}

 主函数:

#include"zy2.h"
#include <stdio.h>
int main(int argc, const char *argv[])
{
	int n;
	trans *s=creat();
	printf("输入一个十进制数:");
	scanf("%d",&n);
	transform_2(s,n);
	show(s);
	transform_8(s,n);
	show(s);
	transform_16(s,n);
	return 0;
}

终端输出:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值