约瑟夫环问题的程序

大憨熊 提交于 2020-03-01 14:27:40

#include <stdio.h>
#include <stdlib.h>

typedef struct lnode
{
    int data;
    int code;
    struct lnode* next;
}lnode, * list;

///////////////////////////////////////////////////////////////////////////////
//辅助函数
lnode* CreateNode()
{
    lnode* p = (lnode*) malloc (sizeof(lnode));
    if (!p)
    {
        exit(0);
    }
    return p;
}

void DestoryNode(lnode* p)
{
    free(p);
}

list ListInsertFront(list l)
{
    lnode *p = CreateNode();
    p->next = l;
    return p;
}

lnode* ListRemoveNext(list prev)
{
    lnode* p = prev->next;
    prev->next = p->next;
    return p;
}

///////////////////////////////////////////////////////////////////////////////
// 创建过程
list CreateRingQueue(int nCount)
{
    list tail, l= CreateNode();
    l->data = 1;
    l->code = nCount;

    tail = l;
    //printf("创建第0个,编号为%d, 自己在%pn",l->code, l);
    for(int i = 1; i < nCount; i++)
    {  
        l = ListInsertFront(l);
        l->code = nCount - i;
        l->data = 0;
        //printf("创建第%d个,编号为%d, 自己在%p, 下一个是%pn", i, l->code, l, l->next);
    }
    tail->next = l; //环形表

    return l;
}

//输入过程
void InitRingQueue(list l, int nCount)
{
    list begin = l;
    int j = 0;

    while( j != nCount)
    {
        printf("输入第%d个的参数", j + 1);
        scanf("%d", &begin->data);
       
        if(begin->data > 0)
        {
            begin = begin->next;
            j++;
        }
    }
   
}


//删除过程
list RemoveFromQueue(list l, int nIdx)
{
    list begin = l, end = l->next;
    int idx = nIdx;

    while(begin != end)
    {
        //printf("从第%d个开始查找第%d个n", begin->code, idx); 
        //查找第n-1个,
        for(int i = 0; i < idx; i++)
        {
            //printf("从第%d个编号为%dn", i, begin->code);
            begin = begin->next;
        }
        //删除第n个
        lnode * p = ListRemoveNext(begin);
       
        //取出下一次的n值
        idx = p->data;

        DestoryNode(p);
        end = begin->next;
    }
    return begin;
}

int main()
{
    int n = 0;
    printf("输入链表长度");
    scanf("%d", &n);
   
    if( n <= 0)
    {
        return 0;
    }
   
    list l = CreateRingQueue(n);
    InitRingQueue(l, n);
    lnode * last = RemoveFromQueue(l, 3);

    printf("last is %d, data is %d", last->code, last->data);
    return 0;
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!