第一题:使用循环链表实现约瑟夫环
第二题:使用栈的特点完成进制转换
1.循环链表实现约瑟夫环
主函数代码:
int main(int argc, const char *argv[])
{
Looplink *L = list_create();
if(NULL==L)
{
return -1;
}
int n,m;
printf("请输入约瑟夫环人数n:\n");
scanf("%d",&n);
printf("请输入出圈数m:\n");
scanf("%d",&m);
for(int i=1;i<=n;i++) //循环尾插数据
{
list_insert_tail(L,i);
}
Looplink *S = list_delete_headnode(L); //删除头结点
Looplink *q = S; //定义遍历指针指向第一个结点
printf("新的序列为:\n");
while(q->next != q) //外层循环
{
int count = 1; //计数
while(count != m-1) //找到要删除位置的前驱结点
{
q = q->next;
count++;
}
//输出数据
printf("%d\t",q->next->data);
//删除结点
Looplink *p = q->next; //标记
q->next = p->next; //孤立
p->next = NULL; //踢开
//q向后偏移,以进入下次循环
q = q->next;
}
printf("%d\n",q->data);
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;
}
//尾插操作
int list_insert_tail(Looplink *L,datatype e)
{
//判断逻辑
if(NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
//申请结点存放数据
Looplink *p = (Looplink *)malloc(sizeof(Looplink));
if(NULL==p)
{
printf("结点申请失败\n");
return -2;
}
p->data = e;
p->next = NULL;
//定义遍历指针定位到最后一个结点
Looplink *q = L;
while(q->next != L)
{
q = q->next;
}
//插入逻辑
p->next = L;
q->next = p;
//表的变化
L->len++;
//printf("插入成功\n");
return 0;
}
//删除头结点
Looplink *list_delete_headnode(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;
}
主函数测试结果:
2.通过栈实现进制转换
主函数代码:
int main(int argc, const char *argv[])
{
//栈实现十进制转八进制
seqStack *S = create(); //创建栈
int num;
printf("请输入一个十进制数:\n");
scanf("%d",&num); //终端输入十进制数
while(num!=0) //循环取余直至余数为0
{
datatype e = num%8;
push(S,e); //余数入栈
num /= 8;
}
printf("其对应的八进制数为:\n");
while(S->top!=-1) //打印对应的八进制数并逐个出栈
{
printf("%d",S->data[S->top]);
pop(S);
}
printf("\n");
return 0;
}
主函数中使用到的功能函数有:
//创建栈
seqStack *create()
{
seqStack *S = (seqStack*)malloc(sizeof(seqStack));
if(NULL==S)
{
printf("创建失败\n");
return NULL;
}
//初始化
//memset(S->data);
S->top = -1; //将栈顶下标设置为-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;
}
//出栈操作(也叫弹栈)
int pop(seqStack *S)
{
//判断逻辑
if(NULL==S || empty(S))
{
printf("出栈失败\n");
return -1;
}
//出栈逻辑
//printf("%d出栈成功\n",S->data[S->top]);
S->top--;
return 0;
}
主函数测试结果: