#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
}
链表实现约瑟夫环问题
于 2022-07-16 20:38:28 首次发布