题目:
题目一:用循环列表实现约瑟夫环
题目二:十进制转换成各种进制
代码实现:
题目一代码:
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出栈成功