1.用无头结点的单向循环链表实现约瑟夫环
1.1 头文件用于声明函数和链表单元
#ifndef __JOSEPH_H__
#define __JOSEPH_H__
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}joseph;
//创建链表
joseph *creat();
//封装结点
joseph *apply(datatype e);
//插入直到链表有n个元素
int insert(joseph *l,int n);
//约瑟夫环输出
void output(joseph *l,int n,int m);
//无头结点的遍历
void show(joseph *h);
#endif
主要函数模块一:创建一个无头结点的循环链表
#include<stdio.h>
#include"joseph.h"
#include<stdlib.h>
//创建链表
joseph *creat()
{
joseph *s=(joseph*)malloc(sizeof(joseph));
if(NULL==s)
{
printf("创建失败\n");
return NULL;
}
s->next=s;
s->data=1;
printf("创建成功\n");
return s;
}
主函数2:根据输入的元素量n把链表元素填充到n个
//插入直到链表有n个元素
int insert(joseph *l,int n)
{
joseph *q=l;
for(int i=2;i<=n;i++)
{
joseph *p=apply(i);
if(NULL==p)
{
printf("插入失败\n");
return -1;
}
while(q->next!=l)
{
q=q->next;
}
p->next=q->next;
q->next=p;
}
printf("插入完成\n");
return 0;
}
其嫁衣函数为封装一个结点
//封装结点
joseph *apply(datatype e)
{
joseph *p=(joseph*)malloc(sizeof(joseph));
if(NULL==p)
{
printf("结点申请失败\n");
return NULL;
}
p->next=NULL;
p->data=e;
return p;
}
主要功能函数3 :根据给定的淘汰值循环遍历链表直到所有人移出链表并依序输出
//约瑟夫环输出
void output(joseph *l,int n ,int m)
{
if(NULL==l)
{
printf("链表不合法,输出失败\n");
return;
}
int count=0;
joseph *q=l;
printf("约瑟夫环按序输出为:");
while(n!=0)
{
count++;
if(count!=m-1)
{
q=q->next;
}
else
{
joseph *d=q->next;
printf("%d\t",d->data);
q->next=d->next;
free(d);
d=NULL;
n--;
count=0;
q=q->next;
}
}
printf("\n");
}
以及无头结点的链表遍历输出(用于查看当前链表)
//无头结点的遍历
void show(joseph *h)
{
if(NULL==h)
{
printf("遍历失败\n");
return ;
}
printf("%d\t",h->data);
joseph *q=h->next;
while(q!=h)
{
printf("%d\t",q->data);
q=q->next;
}
printf("\n");
}
主函数(用于检测功能函数)
#include"joseph.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
joseph *s=creat();
if(NULL==s)
{
return -1;
}
int n,m;
printf("输入环内人数:");
scanf("%d",&n);
insert(s,n);
show(s);
printf("输入逢几淘汰:");
scanf("%d",&m);
output(s,n,m);
return 0;
}
运行结果截图为
2使用顺序栈实现进制转换问题
头文件
#ifndef __CONVERT_H__
#define __CONVERT_H__
#define max 30
typedef int datatype;
typedef struct convert
{
datatype data[max];
int top;
}convert;
//创建栈
convert *creat();
//入栈
int push(convert *s,datatype e);
//遍历栈
void show(convert *s);
//用栈10进制转2进制
int change_2(convert *s,int n);
//用栈10进制转8进制
int change_8(convert *s,int n);
//用栈10进制转16进制
int change_16(convert *s,int n);
#endif
功能函数:
#include <stdio.h>
#include"convert.h"
#include<stdlib.h>
//创建栈
convert *creat()
{
convert *s=(convert*)malloc(sizeof(convert));
if(NULL==s)
{
printf("创建失败\n");
return NULL;
}
s->top=-1;
printf("创建成功\n");
return s;
}
//入栈
int push(convert *s,datatype e)
{
if(NULL==s||s->top==max-1)
{
printf("入栈失败\n");
return -1;
}
s->top++;
s->data[s->top]=e;
return 0;
}
//遍历栈
void show(convert *s)
{
if(NULL==s||s->top==-1)
{
printf("遍历失败\n");
return ;
}
for(int i=s->top;i>=0;i--)
{
printf("%d",s->data[i]);
}
printf("\n");
}
//用栈10进制转2进制
int change_2(convert *s,int n)
{
if(NULL==s)
{
printf("转换失败\n");
return -1;
}
int a;
while(n/2!=0)
{
push(s,n%2);
n=n/2;
}
push(s,n);
printf("其二进制数为:");
show(s);
s->top=-1;
return 0;
}
//用栈10进制转8进制
int change_8(convert *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("其8进制数为:");
show(s);
s->top=-1;
return 0;
}
//用栈10进制转16进制
int change_16(convert *s,int n)
{
if(NULL==s)
{
printf("转化失败\n");
return -1;
}
while(n/16!=0)
{
push(s,n%16);
n=n/16;
}
push(s,n%16);
printf("其16进制数为:");
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"convert.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
convert *s=creat();
if(NULL==s)
{
return -1;
}
int n;
printf("输入一个十进制数n:");
scanf("%d",&n);
change_2(s,n);
change_8(s,n);
change_16(s,n);
return 0;
}
运行结果截图