第一题:使用循环链表实现约瑟夫环
主函数:
#include<stdlib.h>
#include<stdio.h>
#include"looplink.h"
int main(int argc, const char *argv[])
{
//创建链表
Looplink *L= list_create();
if(NULL==L)
{
return -1;
}
//输入变量
int n,m;
printf("请输入数据个数:");
scanf("%d",&n);
printf("请输入第多少个出圈:");
scanf("%d",&m);
//循环尾插输入
for(int i=1;i<=n;i++)
{
list_insert_tail(L,i);
}
//删头
Looplink*p=L->next;
kill_head(L);
//循环输出
for(int a=1;a<=n;a++)
{
for(int b=1;b<m-1;b++)
{
p=p->next;
}
//输出第m个数字
printf("%d\t",p->next->data);
//删除第m个数字
Looplink*q = p->next; //定位
p->next = q->next; //孤立
q->next = p; //删除
free(q);
q=NULL;
p=p->next; //下次计数从m+1开始
}
return 0;
}
结果:
调用函数:
//创建
Looplink *list_create()
{
Looplink *L = (Looplink*)malloc(sizeof(Looplink));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}
//初始化
L->len = 0;
L->next = L;
printf("创建成功\n");
return L;
}
//删头
Looplink *kill_head(Looplink*L)
{
//判断逻辑
if(NULL==L||list_empty(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;
}
第二题:使用栈的特点完成进制转换
主函数:
#include<stdio.h>
#include<stdlib.h>
#include"seqstack.h"
int main(int argc, const char *argv[])
{
seqStack*S= create();
if(NULL==S)
{
return -1;
}
int n,m;
printf("请输入要转换的数据:");
scanf("%d",&n);
printf("请输入要转换的进制:");
scanf("%d",&m);
int s=n;
while(s!=0)
{
datatype e=s%m;
push(S,e);
s=s/m;
}
show(S);
return 0;
}
结果:
调用的函数:
//创建
seqStack *create()
{
seqStack*S = (seqStack*)malloc(sizeof(seqStack));
if(NULL==S)
{
printf("创建失败\n");
return NULL;
}
//初始化
S->top = -1;
printf("创建成功\n");
return S;
}
//入栈、进栈、压栈
int push(seqStack*S,datatype e)
{
//判断逻辑
if(NULL==S||full(S))
{
printf("入栈失败\n");
return -1;
}
//入栈操作
S->top++;
S->data[S->top] = e;
printf("入栈成功\n");
return 0;
}