作业1>实现过程:
1、功能函数
//创建
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;
}
//头插
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_loop(LoopLink *L,int n,int m)
{
//判断逻辑
if(NULL==L)
{
printf("表不合法\n");
return;
}
//循环头插需要的n个数据
for(int i=n;i>0;i--)
{
list_insert_head(L,i);
}
//定义一个指针指向头结点遍历
LoopLink *q=L;
//定义一个搬运工指针
LoopLink *p;
//循环输出
while(L->len)
{
//找到要输出的结点的前驱结点(m-1)结点
for(int i=1;i<m;i++)
{
q=q->next;
//跳过头结点
if(q==L)
{
q=q->next;
}
}
//定义一个搬运工指针指向要输出m结点
p=q->next;
//跳过头结点
if(p==L)
{
p=p->next;
}
//输出m结点的数据
printf("%-4d",p->data);
//删除m结点
q->next=p->next;
free(p);
p=NULL;
//表长变化
L->len--;
}
//将链表初始化
L->next=L;
putchar(10);
}
2、主函数调用:
//创建单向循环链表
LoopLink *L=list_create();
if(NULL==L)
{
return -1;
}
//调用函数
list_loop(L,8,4);
list_loop(L,8,4);
list_loop(L,7,4);
list_loop(L,8,5);
实现效果
作业2>实现过程:
1、功能函数
//创建
seqStack *stack_create()
{
seqStack *S=(seqStack *)malloc(sizeof(seqStack));
if(NULL==S)
{
printf("创建失败\n");
return NULL;
}
//初始化
S->top=-1;
printf("创建成功\n");
return S;
}
//入栈、进栈、压栈
void stack_push(seqStack *S,datatype e)
{
//判断逻辑
if(NULL==S||stack_full(S))
{
printf("入栈失败\n");
return;
}
//先加,后压
S->top++;
S->data[S->top]=e;
printf("入栈成功\n");
}
//通过栈实现十进制求其其它任意进制
void stack_Doc_base(seqStack *S,int Doc,int Base)
{
//定义一个变量接收余数
datatype B;
do
{
B=Doc%Base;
Doc=Doc/Base;
stack_push(S,B);//从第一个余数开始依次入栈
}while(Doc!=0); //判断商为0结束循环
while(S->top!=-1) //遍历出栈
{
stack_pop(S);
}
}
//遍历
void stack_show(seqStack *S)
{
//判断逻辑
if(NULL==S||stack_empty(S))
{
printf("遍历失败");
return;
}
printf("栈中从栈顶到栈低的元素是>>>");
//循环依次遍历输出
for(int i=S->top;i>-1;i--)
{
printf("%-3d",S->data[i]);
}
printf("\n");
}
//出栈
void stack_pop(seqStack *S)
{
//判断逻辑
if(NULL==S||stack_empty(S))
{
printf("出栈失败\n");
return;
}
//先弹后减
printf("%d出栈成功\n",S->data[S->top]);
S->top--;
}
2、主函数调用
//创建栈
seqStack *S=stack_create();
if(NULL==S)
{
return -1;
}
//进制转换函数调用
stack_Doc_base(S,8,2);
实现效果: