Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135461
  • 博文数量: 24
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 590
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-18 08:29
文章分类

全部博文(24)

文章存档

2011年(1)

2009年(5)

2008年(18)

我的朋友

分类: C/C++

2008-03-23 21:58:31

菜鸟学习数据结构当然要比别人更加刻苦了,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指向的结构体变量
阅读(1135) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~