实现约瑟夫环(参数1:单向循环链表,参数2:间隔数)
解题思想:
1.判断链表是否合法
2.(该约瑟夫环为有头结点的约瑟夫环)判断结点的下一个结点是否为头节点,如果为头节点,需要再向后循环一次,但要根据自己循环要求来实现
3.判断输出结点是否为头结点,如果是向后取一个,不是则直接取值;
4.每次输出之后要删除,因为约瑟夫数列每个值只取一次
5.每次循环的开始是输出后的一个结点,除了第一次
//约瑟夫环
void list_yue(forlinkptr F,int k)
{
if(NULL == F)
{
printf("链表不合法\n");
return;
}
int n=F->len;
forlinkptr q=F,p;
for(int i=0;i<n;i++)
{
for(int j=0;j<k-1;j++)
{
q=q->next;//记录输出前一个位置
if(q==F)
{
j--;
}
}
p=q->next;
if(p == F)
{
p = F->next;
}
printf("%d\t",p->data);
q->next = p->next;
free(p);
F->len--;
}
}
使用栈来进行进制转换(利用栈的先进后出特点)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define max 10
typedef int datatype;
typedef struct
{
int top;
datatype *data;
}stack,*stackptr;
//创建栈并申请空间
stackptr list_creat()
{
stackptr S = (stackptr)malloc(sizeof(stack));
if(NULL == S)
{
printf("创建失败\n");
return NULL;
}
//创建成功后需要给栈申请连续的空间
S->data = (datatype *)malloc(sizeof(datatype)*max);
if(NULL == S->data)
{
printf("申请失败\n");
free(S);
return NULL;
}
//初始化
S->top=-1;
printf("创建成功\n");
return S;
}
//判空
int list_empty(stackptr S)
{
if(NULL != S)
{
return S->top == -1;
}
printf("栈不合法\n");
return 0;
}
//判满
int list_full(stackptr S)
{
if(NULL != S)
{
return S->top == max-1;
}
printf("栈不合法\n");
return 0;
}
//入栈
int list_push(stackptr S,datatype a)
{
if(NULL == S || list_full(S))
{
printf("入栈失败\n");
return 0;
}
S->top++;
S->data[S->top]=a;
printf("%d入栈成功\n",S->data[S->top]);
return 1;
}
//出栈
int list_pop(stackptr S)
{
if(NULL == S || list_empty(S))
{
printf("出栈失败\n");
return 0;
}
printf("%d",S->data[S->top]);
S->top--;
return 1;
}
int main(int argc, const char *argv[])
{
stackptr S = list_creat();
if(NULL == S)
{
return -1;
}
int a;//输入的数
scanf("%d",&a);
int b;//转换成的进制
scanf("%d",&b);
int t;
while(a!=0)
{
datatype t;
t=a%b;
list_push(S,t);
a/=b;
}
while(S->top != -1)
{
list_pop(S);
}
putchar(10);
return 0;
}