链表实现约瑟夫环问题

#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
    int data;
    struct link *next;
} link_t, *link_p;

int main()
{
    int i,n,num;
    printf("请输入个数:");
    scanf("%d",&num);
    printf("请输入:");
    scanf("%d",&n);
    //putchar(10);
    link_p p = (link_p)malloc(sizeof(link_t));
    if (NULL == p)
    {
        printf("create mallo err!!\n");
        return -1;
    }
    p->next = NULL;
    p->data = 1;
    link_p new = NULL;
    link_p sp = p;
    for (i = 2;i<=num;i++)
    {
    //添加新的节点
        new=(link_p)malloc(sizeof(link_t));
        new->data=i;
        new->next=NULL;
        p->next=new;
        p=new;//等价于p=p->next;因为p->next 现在是new的地址;向后移动
    }
    //现在p移动到最后一个节点p->next=sp首尾相连构成回环;
    p->next=sp;
//     printf("%d\n",sp->data);

//  //想要删除当前节点,需要移动到该节点的前一个节点,访问前一个节点的指针域,里面保存的是该节点的地址
//     for(i=0;i<n-2;i++) 
//     //要使用的是位置,要分析位置,,指针域中的内容,,1位置的保存在8下的指针域
//     //我要移动到3这个位置上,需要得到3的位置,2下的指针域保存着所以要移动到2的位置                
//     {
//         sp=sp->next;
//     }
//     while( sp != sp->next)
//     {
//         for(i=0;i<n-1;i++)//现在总的位置是在2上,使用的是2这个值位置下的指针域所以移动三次0 1 2
//         {
//             sp=sp->next;
//         }
//         new=sp->next;//new现在保存的是下一个节点的地址
//         sp->next=new->next;//new->next访问的是下下一个节点的位置,将这个位置给sp->next,将中间节点跳过
//         free(new);
//         new=NULL;
//     }
//     printf("king is %d\n",sp->data);
    
    
    
    #if 1
    //遍历打印
    //sp的地址,不等于sp下的指针域的下一个节点的地址,构成死循环;
    while(sp !=sp->next)
    {
        printf("%d\n",sp->data);
        getchar();
        sp=sp->next;
    }
    #endif


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值