1.使用循环链表实现约瑟夫问题
//循环删除输出指定数字节点
int loop_delete(loop_link *L, int n, int m)
{
//判断逻辑
if(L==NULL || n<1)
{
printf("不合法\n");
return -1;
}
loop_link *q = L;
loop_link *p = NULL;//用于标记节点,及时销毁节点
//将最后一个节点指向第一个节点
while(q->next != L)
{
q = q->next;
}
q->next = L->next;
q = L;//重新指向头节点
//循环输出指定数字m的人员编号
while(L->len > 0)
{
for(int i=1; i<m; i++)
{
q = q->next;
}
p = q->next;//标记
q->next = q->next->next;//孤立
printf("%d\t",p->data);//输出目标
free(p);//销毁节点
//表长变化
L->len--;
p = NULL;
}
printf("\n循环输出完成\n");
return 0;
}
结果:
创建成功
请输入总人数和指定数字
8 4
4 8 5 2 1 3 7 6
循环输出完成
ubuntu@ubuntu:hw2$ ./a.out
创建成功
请输入总人数和指定数字
8 3
3 6 1 5 2 8 4 7
循环输出完成
测试代码:
#include "./looplink.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
loop_link *L = creat();
if(L==NULL)
{
return -1;//创建失败,结束主函数
}
int n,m;//n总人数,指定数字
printf("请输入总人数和指定数字\n");
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++) //编号
{
tail_insert(L,i);
}
loop_delete(L,n,m);
return 0;
}
相关函数
//创建单向循环链表
loop_link *creat()
{
//申请空间
loop_link *L = (loop_link*)malloc(sizeof(loop_link));
if(L == NULL)
{
printf("创建失败\n");
return NULL;
}
//初始化
L->len = 0;
L->next = L;
printf("创建成功\n");
return L;
}
//在尾部添加节点
int tail_insert(loop_link *L, datatype value)
{
//逻辑判断
if(L==NULL)
{
printf("链表不合法,插入失败\n");
return -1;
}
//申请一个新节点
loop_link *p = (loop_link*)malloc(sizeof(loop_link));
if(p == NULL)
{
printf("申请失败\n");
return -2;
}
p->data = value; //给新节点赋值
p->next = NULL;
//找到原表中最后一个节点
loop_link *q = L;
while(q->next != L)
{
q = q->next;
}
//在表尾添加新节点
q->next = p;
p->next = L;
//表长变化
L->len++;
}
2.使用栈将一个十进制数转换成任意进制
//将任意数转换成任意进制
int trans(int num, int base)
{
//创建栈
stack *s = creat();
if(s == NULL)
{
return -1; //创建失败
}
printf("%d转换为%d进制为:",num,base);
do
{
push(s,num%base); //入栈
num /= base;
}while(num != 0);
pop(s); //出栈
putchar(10); //换行
free_stack(s); //销毁栈
return 0;
}
测试代码
#include <stdio.h>
#include "./stack.h"
int main(int argc, const char *argv[])
{
int num,base;//num被转换的数,base进制
printf("请输入被转化的数:");
scanf("%d", &num);
printf("请输入需要转换成几进制:");
scanf("%d", &base);
trans(num,base);
return 0;
}
结果:
请输入被转化的数:852
请输入需要转换成几进制:2
创建成功
852转换为2进制为:1101010100
销毁成功
ubuntu@ubuntu:homework$ ./a.out
请输入被转化的数:852
请输入需要转换成几进制:8
创建成功
852转换为8进制为:1524
销毁成功
相关函数
#ifndef __STACK_H__
#define __STACK_H__
#define MAX 20
typedef struct
{
int data[MAX];
int top;
}stack;
#include <stdio.h>
#include <stdlib.h>
#include "./stack.h"
//创建栈
stack *creat()
{
stack *s = (stack*)malloc(sizeof(stack));
if(s == NULL)
{
printf("创建失败\n");
return NULL;
}
s->top = -1;
printf("创建成功\n");
return s;
}
//入栈
int push(stack *s, int value)
{
if(s == NULL)
{
printf("栈不合法,入栈失败\n");
return -1;
}
s->top++;
s->data[s->top] = value;
return 0;
}
//出栈
int pop(stack *s)
{
if(s == NULL)
{
printf("栈不合法,出栈失败\n");
return -1;
}
while(s->top >= 0)
{
printf("%d",s->data[s->top]);
s->top--;
}
return 0;
}
//销毁栈
void free_stack(stack *s)
{
if(s != NULL)
{
free(s);
s = NULL;
}
printf("销毁成功\n");
}