目录
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;
}