1. 程式人生 > >資料結構-約瑟夫問題

資料結構-約瑟夫問題

#include<stdio.h>
#include<stdlib.h>
int list_len = 0;
typedef struct note
{
    int xuhao;
    struct note *next;
}linklist_t;

linklist_t * creat_linklist()
{
    linklist_t * h ;
    h = (linklist_t *)malloc(sizeof(linklist_t));
    h->xuhao=1;
    h->next = h;
    list_len ++;
    return h;
}

void append_linklist(linklist_t *h,int value)
{
    linklist_t *p;
    p = (linklist_t *)malloc(sizeof(linklist_t));
    p->xuhao = value;
    p->next = h->next;
    h->next = p;
    list_len++;
}



void linklist_t_show(linklist_t *h)
{
    linklist_t *p = h;
    int i;
    for(i=0;i<list_len;i++)
    {
        printf("%d  ",p->xuhao);
        p = p->next;
    }
    printf("\n");
}

int  remove_linklist(linklist_t *h,int value)
{
    linklist_t *p  = h;
    linklist_t *q = NULL;
    int i;
    for(i=0;i<list_len;i++)
    {
        if (p->next->xuhao == value)
        {
            q = p->next;
            p->next =p->next->next;
            free(q);
            list_len--;
            break;

        }
        p = p->next;
    }
    return list_len;

}


void joseph_linklist(linklist_t *h,int begin,int len)
{
    linklist_t *p = h ;
    int i,j ,num=1;
    for(i=1;i<begin;i++)
    {
        p = p->next;
    }
    while(num>0)
    {
        for(j=1;j<len;j++)
        {
            p = p->next;
        }
        printf("%-3d",p->xuhao);
        num = remove_linklist(h,p->xuhao);
        p = p->next;

    }
    printf("\n");
}

int main()
{
    linklist_t *H =creat_linklist();
    int i,ret;
    for(i=8;i>1;i--)
    {
        append_linklist(H,i);
    }
    linklist_t_show(H);
    joseph_linklist(H,3,4);
    return 0;
}