菜鸟学习数据结构当然要比别人更加刻苦了,c语言的基础不太好,故而把每一个必要的过程记录下来了
#include /*输入和输出*/
#include /*下面的memset()在这个里面*/
#include /*字符串函数将用到*/
#include /*动态存储分配函数*/
/* 结构体和函数声明 */
typedef struct _node_t /*typedef 可以使得明便名*/
{
int n_num; /*把那些变量写的更明了一些*/
struct _node_t *next; /*结构类型变量*/
} node_t;
node_t *node_t_create(int n);
node_t *node_t_get(node_t **pn, int m);
/* 功能函数实现 */
/*
* * name: node_t_create
* * params:
* * n [in] 输入要构造的链表的个数
* * return:
* * 返回构造成功的环形单向链表指针
* * notes:
* * 构造节点数量为 n 的环形单向链表
* *使用倒插法
* */
node_t * node_t_create(int n)
{
node_t *p_ret = NULL;
if (0 != n) /*防止n为0*/
{
int n_idx = 1; /*计数*/
node_t *p_node = NULL;
/* 构造 n 个 node_t 首先申请结点*/
p_node = (node_t *) malloc(n * sizeof(node_t));
if (NULL == p_node)
return NULL;
else
memset(p_node, 0, n * sizeof(node_t));
/* 内存空间 申请 成功 */
p_ret = p_node;
for (; n_idx < n; n_idx++) /*使得1到n-1得到值*/
{
p_node->n_num = n_idx;
p_node->next = p_node + 1;
p_node = p_node->next;
}
p_node->n_num = n;
p_node->next = p_ret;/*使得p_ret始终指向尾结点*/
}
return p_ret;
}
/*
* * name: main
* * params:
* * none
* * return:
* * int
* * notes:
* * main function
* *
* */
int main()
{
int n, m;
node_t *p_list, *p_iter;
printf("please input number:");
scanf("%d%d",&n,&m);
/* 构造环形单向链表 */
p_list = node_t_create(n);
/* Josephus 循环取数 */
p_iter = p_list;
m %= n;
while (p_iter != p_iter->next)
{
int i = 1;
/* 取到第 m-1 个节点 */
for (; i < m - 1; i++)
{
p_iter = p_iter->next;
}
/* 输出第 m 个节点的值 */
printf("%d ", p_iter->next->n_num);
/* 从链表中删除第 m 个节点 */
p_iter->next = p_iter->next->next;
p_iter = p_iter->next;
}
printf("%d ", p_iter->n_num);
/* 释放 申请 的空间 */
free(p_list);
system("PAUSE");/*PAUSE是dos下的“按任意键继续”的命令 */
}
菜鸟学习吗?
代码好像一些乱了,不好意思哦,以后一定给以很多的代码,free()是释放空间的函数
creat()是创建链表的函数, *P是表示p指向的结构体变量
阅读(1162) | 评论(0) | 转发(0) |