题目一:用循环列表实现约瑟夫环 题目二:十进制转换成二进制

题目:

题目一:用循环列表实现约瑟夫环

题目二:十进制转换成各种进制

代码实现:

题目一代码:

looplink.h

#ifndef __CIRLIST_H__
#define __CIRLIST_H__

typedef int datatype;
typedef struct Node
{
	union{
		int len;
		datatype data;
	};
	
	struct Node *next;
}looplink;


//创建
looplink *list_creat();
//判空
int list_empty(looplink *L);

//头插
int list_insert_head(looplink *L,datatype e);

//遍历
void list_show(looplink *L);
//头删
int list_delete_head(looplink *L);
//删除头结点
looplink *list_kill_head(looplink *L);
//删除头结点后的遍历
void list_show2(looplink *H);
//按位置查找
looplink *list_find_node(looplink *L,int pos);

void list_new(looplink *L,int pos);








#endif

looplink.c

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


//创建
looplink *list_creat()
{
	looplink *L=(looplink *)malloc(sizeof(looplink));
	if(NULL==L)
	{
		printf("申请失败\n");
		return NULL;
	}
	//初始化
	L->len=0;
	L->next=L; //将指针域指向自己
	return L;
}

//判空
int list_empty(looplink *L)
{
	return L->next==L ?1:0;
	

}

//头插
int list_insert_head(looplink *L,datatype e)
{
	if(NULL==L)
	{
		printf("所给链表不合法\n");
		return 0;
	}
	looplink *p=(looplink *)malloc(sizeof(looplink));
	if(NULL==p)
	{
		printf("结点申请失败\n");
		return 0;
	}
	p->data=e;
	p->next=NULL;
	p->next=L->next;
	L->next=p;
	L->len++;
	printf("插入成功\n");
	return 1;


}

//遍历
void list_show(looplink *L)
{
	if(NULL==L ||L->next==L)
	{
		printf("遍历失败\n");
		return;
	}
	looplink *q=L->next;
	while(q!=L)
	{
		printf("%d\t",q->data);
		q=q->next;
	
	}
	printf("\n");

}
//头删
int list_delete_head(looplink *L)
{
	if(NULL==L || list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	
	}
	looplink *p=L->next;
	L->next=p->next;
	free(p);
	p=NULL;
	L->len--;
	printf("删除成功\n");
	return 0;
}
//删除头结点
looplink *list_kill_head(looplink *L)
{
	if(NULL==L || L->next==L)
	{
		printf("去头结点失败\n");
		return NULL;
	
	}
	looplink *q=L->next;
	while(q->next!=L)
	{
		q=q->next;
	}
	q->next=L->next;
	free(L);
	L=NULL;
	printf("去头成功\n");

	return q->next;


}
//删除头结点后的遍历
void list_show2(looplink *H)
{
	if(NULL==H)
	{
		printf("遍历失败\n");
		return;
	
	}
	//定义遍历指针从第一个结点出发
	looplink *q=H;
	do
	{
		printf("%d\t",q->data);
		q=q->next;
	}while(q!=H);
	printf("\n");
}

looplink *list_find_node(looplink *L,int pos)
{
	if(NULL==L || L->next==L)
	{
		printf("查找失败\n");
		return NULL;
	}
	looplink *q=L;
	for(int i=0;i<L->len;i++)
	{
		q=q->next;
	
	}
	return q;

}

void list_new(looplink *L,int pos)
{
	if(NULL==L || L->next==L)
	{
		printf("输出错误\n");
		return;
	}
	int i=L->len;   //确定结点个数
	looplink *H=list_kill_head(L); //去头
	L=NULL;
	looplink *q;   //定义指针指向将要删除的结点
	for(int j=0;j<i;j++)  //将将要删除的结点遍历一遍
	{
		for(int k=1;k<pos-1;k++)  //指针指向将要删除结点的前一个位置
		{
			H=H->next;
		}
		q=H->next;
		printf("%d\t",q->data);
		H->next=q->next;
		free(q);    //释放
		q=NULL;
	}
	printf("\n");
	return;	
}

main.c

#include"cirlist.h"
#include<stdlib.h>
#include <stdio.h>
int main(int argc, const char *argv[])
{
	looplink *L=list_creat();
	if(NULL==L)
	{
		return -1;
	}
	list_insert_head(L,1);
	list_insert_head(L,2);
	list_insert_head(L,3);
	list_insert_head(L,4);
	list_insert_head(L,5);
	list_insert_head(L,6);
	list_insert_head(L,7);
	list_insert_head(L,8);
	list_show(L);  
	//调用约瑟夫函数
	list_new(L,4);

	
	

	return 0;
}

运行结果:

插入成功
插入成功
插入成功
插入成功
插入成功
插入成功
插入成功
插入成功
8	7	6	5	4	3	2	1	
去头成功
5	2	7	3	6	8	4	1	

题目二:用栈表示十进制转换二进制

代码实现:

seqstack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__

#define MAX 20
typedef int datatype;
typedef struct
{
    datatype data[MAX];         //存储栈的数组
    int top;                   //记录栈顶元素所在的下标
}seqStack;

//创建
seqStack *stack_creat();
//判空
int stack_empty(seqStack *S);
//判满
int stack_full(seqStack *S);
//入栈
void stack_push(seqStack *S,datatype e);
//遍历
void stack_show(seqStack *S);
//出栈
void stack_pop(seqStack *S);
//栈的容量
int stack_size(seqStack *S);
//返回栈顶元素
datatype stack_top(seqStack *s);


void stack_two(seqStack *S,datatype e);


#endif

seqstack.c

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


//创建
seqStack *stack_creat()
{
	seqStack *S=(seqStack *)malloc(sizeof(seqStack));
	if(NULL==S)
	{
		printf("申请失败\n");
		return NULL;
	
	}
	S->top=-1;
	printf("创建成功\n");
	return S;
}
//判空
int stack_empty(seqStack *S)
{
	return S->top==-1;

}
//判满
int stack_full(seqStack *S)
{
	return S->top==MAX-1;

}
//入栈
void stack_push(seqStack *S,datatype e)
{
	if(NULL==S || stack_full(S))
	{
		printf("入栈失败\n");
		return;
	
	}
	//先加后压
	//S->data[++S->top]=e;
	++S->top;
	S->data[S->top]=e;
	printf("入栈成功\n");


}
//遍历
void stack_show(seqStack *S)
{
	if(NULL==S || stack_empty(S))
	{
		printf("遍历失败\n");
		return;
	
	}
	printf("栈中从栈顶到栈底元素分别是:");
	for(int i=S->top;i>=0;i--)
	{
		printf("%d\t",S->data[i]);
	}
	putchar(10);


}
//出栈
void stack_pop(seqStack *S)
{
	if(NULL==S || stack_empty(S))
	{
		printf("出栈失败\n");
		return;
	
	}
	//先弹后减
	printf("%d出栈成功\n",S->data[S->top]);
	S->top--;

}
//栈的容量
int stack_size(seqStack *S)
{
	return S->top+1;

}
//返回栈顶元素
datatype stack_top(seqStack *S)
{
	if(NULL==S || stack_empty(S))
	{
		printf("获取失败\n");
		return -1;
	}
	return S->data[S->top];
}

void stack_two(seqStack *S,datatype e)
{
	if(NULL==S)
	{
		printf("转换失败\n");
	}
	int k=0;
	while(e>0)
	{
		k=e%2;              //要转换的数字对二取余

		stack_push(S,k);    //进栈
		e=e/2;              //对二取整进入下一次循环
	
	}
	while(S->top>=0)
	{
		stack_pop(S);     //出栈
	}
	printf("\n");
	

}

main.c

#include"seqstack.h"
#include<stdlib.h>
#include <stdio.h>
int main(int argc, const char *argv[])
{
	seqStack *S=stack_creat();
	if(NULL==S)

	{
		return -1;
	}
	/*stack_push(S,1);
	stack_push(S,2);
	stack_push(S,3);
	stack_push(S,4);
	//遍历
	stack_show(S);
	//调用出栈函数
	stack_pop(S);
	stack_show(S);
	//调用栈的容量函数
	stack_size(S);
  	//返回栈顶元素、
	stack_top(S);
	*/stack_two(S,13);
	
	return 0;
}

运行结果:

创建成功
入栈成功
入栈成功
入栈成功
入栈成功
1出栈成功
1出栈成功
0出栈成功
1出栈成功

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值