荆轲 发表于 2022-4-12 19:02:59

数据结构与算法-线性表13

//编号为1-N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数,可自由输入),
//开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,
//报到M时停止报数。报M的人出列,将他的密码作为新的M值,从他开始继续顺时针报数,
//如此循环下去,直到所有人全部出列为止。



typedef struct node
{
        int num;
        int        data;
        struct node *next;
}node;

node *create(int n)//创建n个数据结构
{
        node *p=NULL,*head,*temp;
        int i=1;
        head=(node*)malloc(sizeof(node));//申请内存
        p=head;

        if(0!=n)
        {
                while(i<=n)
                {
                        temp=(node *)malloc(sizeof(node));
                        temp->num=i++;
                        temp->data= rand() % 50+1;//循环列表初始化,每个人的M随机赋值0—99
                        p->next=temp;
                        p=temp;
                }
                temp->next=head->next;//最后一个指向第一个结点,最开始的舍去
        }
        free(head);
        return temp->next;
}
void main()
{
        node *temp;
        int i,n=50,temp_M;//50个人

        node *p=create(n);
        printf("num\tM\n");
        for(i=0;i<50;i++)
        {
                printf("%d\t%d\n",p->num,p->data);
                p=p->next;
        }
        printf("\n\n");


        temp_M=p->data;

        while(p!=p->next)
        {
                for(i=1;i<temp_M-1;i++)
                {
                        p=p->next;
                }
                temp_M=p->next->data;
                printf("%d->",p->next->num);
                temp=p->next;//删除第temp_M个结点
                p->next=temp->next;

                free(temp);
                p=p->next;
        }
        printf("%d\n",p->data);
        return 0;
}
页: [1]
查看完整版本: 数据结构与算法-线性表13