华清远见第三课程da6作业

单链表实现约瑟夫环

 头文件

#ifndef _LOOPLINK_H_
#define _LOOPLINK_H_

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

//创建循环链表
Looplink list_create();
//判空
int list_empty(Looplink L);
//尾插
int list_insert_tail(Looplink L,datatype e);
//遍历
void list_show(Looplink L);
//尾删
void list_delete_tail(Looplink L);
//销毁
void list_free(Looplink L);
//约瑟夫环
void josephus(Looplink L);

#endif

源文件

#include "looplink.h"
#include 
#include 

//创建循环链表
Looplink list_create(){
	Looplink L=(Looplink)malloc(sizeof(Node));
	if(NULL==L){
		printf("创建失败\n");
		return NULL;
	}
	L->len=0;
	L->next=L;
	printf("创建成功\n");
	return L;
}

//判空
int list_empty(Looplink L){
	if(NULL!=L){
		return L->next==L;
	}
	printf("链表不合法\n");
	return -1;
}
//尾插
int list_insert_tail(Looplink L,datatype e){
	if(NULL==L){
		printf("链表不合法");
		return -1;
	}
	Looplink p=(Looplink)malloc(sizeof(Node));
	p->data=e;
	p->next=NULL;
	Looplink q=L;
	while(q->next !=L){
		q=q->next;
	}
	p->next=L;
	q->next=p;
	L->len++;
	return 1;
}
//遍历
void list_show(Looplink L){
	if(NULL==L){
		printf("链表不合法");
		return ;
	}
	Looplink q=L->next;
	while(q->next!=L){
		printf("\t%d",q->data);
		q=q->next;
	}
	printf("\n");
}
//尾删
void list_delete_tail(Looplink L){
	if(NULL==L){
		printf("链表不合法");
		return ;
	}
	Looplink q=L->next;
	while(q->next->next!=L){
		q=q->next;
	}
	free(q->next);
	q->next=L;
	L->len--;
}
//约瑟夫环
void josephus(Looplink L){
	if(NULL==L){
		printf("链表不合法");
		return ;
	}
	int i=0;
	Looplink p=L;
	while(p->next !=L){
		p=p->next;
	}
	p->next=L->next;//将头结点和循环链表隔离开
	while(p->next->next!=p){
		if(i+1==3){
			printf("%d\n",p->next->data);
			free(p->next);
			p->next=p->next->next;
			i=0;
		}
		p=p->next;
		i++;
	}
	printf("%d\n%d\n",p->data,p->next->data);
}
			
			

测试文件

#include"looplink.h"
int main(){
	Looplink L=list_create();
	int i=1;
	while(i<42){
		list_insert_tail(L,i);
		i++;
	}
	//list_show(L);
	josephus(L);
	return 0;
}

测试结果

华清远见第三课程da6作业_第1张图片

 

栈实现二进制转换

头文件

#ifndef _STACK_H_
#define _STACK_H_

#define MAXSIZE 20
typedef int datatype;

typedef struct{
	datatype *data;
	int top;
}Stack,*StackPtr;
//创建栈
StackPtr stack_create();
//判空
int stack_empty(StackPtr S);
//判满
int stack_full(StackPtr S);
//入栈
int stack_push(StackPtr S,datatype e);
//遍历栈
void stack_show(StackPtr S);
//出栈
int stack_pop(StackPtr S);
//获取栈顶元素
datatype *stack_top(StackPtr S);
//求栈大小
int stack_size(StackPtr S);
//销毁栈
void stack_free(StackPtr S);
#endif

源代码

#include "stack.h"
#include 
#include 
//创建栈
StackPtr stack_create(){
	StackPtr S=(StackPtr)malloc(sizeof(Stack));
	if(NULL==S){
		printf("栈申请失败\n");
		return NULL;
	}
	S->data=(datatype *)malloc(sizeof(datatype)*MAXSIZE);
	if(NULL==S->data){
		printf("申请失败\n");
		free(S);
		return NULL;
	}
	S->top=-1;
	printf("创建成功\n");
	return S;
}
//判空
int stack_empty(StackPtr S){
	if(NULL!=S){
		return S->top ==-1;
	}
	printf("所给栈不合法\n");
	return -1;
}
//判满
int stack_full(StackPtr S){
	if(NULL!=S){
		return S->top==MAXSIZE-1;
	}
	printf("所给栈不合法\n");
	return -1;
}
//入栈
int stack_push(StackPtr S,datatype e){
	if(NULL==S || stack_full(S)){
		printf("所给栈不合法");
		return -1;
	}
	S->top++;
	S->data[S->top]=e;
	return 1;
}
//遍历栈
void stack_show(StackPtr S){
	if(NULL==S||stack_empty(S)){
		printf("所给栈不合法\n");
		return ;
	}
	printf("从栈顶到栈底的元素分别是\n");
	for(int i=S->top;i>=0;i--){
		printf("%d\n",S->data[i]);
	}
	printf("\n");
}
//出栈
int stack_pop(StackPtr S){
	if(NULL==S||stack_empty(S)){
		printf("所给栈不合法\n");
		return -1;
	}
		printf("%d\n",S->data[S->top]);
		S->top--;
		return 1;
}
//获取栈顶元素
datatype *stack_top(StackPtr S){
	if(NULL==S||stack_empty(S)){
		printf("所给栈不合法\n");
		return NULL;
	}
	return &S->data[S->top];
}
//求栈大小
int stack_size(StackPtr S){
	if(NULL==S||stack_empty(S)){
		printf("所给栈不合法\n");
		return -1;
	}
	printf("%d\n",S->top);
	return 1;
}
//销毁栈
void stack_free(StackPtr S){
	if(NULL==S||stack_empty){
		printf("所给栈不合法");
		return ;
	}
	free(S->data);
	S->data=NULL;
	free(S);
	S=NULL;
	printf("释放成功");
}

测试文件

#include "stack.h"	
#include 
int main(int argc, const char *argv[])
{
	StackPtr S= stack_create();
	int i=0;
	printf("请输入需要转换的十进制数");
	scanf("%d",&i);
	while(i>0){
		if(i%2==0)stack_push(S,0);
		else if(i%2==1)stack_push(S,1);
		i=i/2;
	}
	stack_show(S);
	return 0;
}

结果

华清远见第三课程da6作业_第2张图片

 

你可能感兴趣的:(数据结构)