1、你的链表创建的不对,你的建表方式促使最终两个节点为一个循环;
2、报数过程也是难题c 循环链表,遇到头节点要空开;并且过程逻辑似乎不对
下面是改好的代码,没有测试很多实例
#include
#include
typedef int Elemtype;
typedef struct LNode
{
Elemtype data;
struct LNode *next;
}LNode,*LinkList;
void createlist(LinkList head,int n)
{
int i;
LinkList p,q;
*head=(LinkList)malloc(sizeof(LNode));
(*head)->next=*head;
p=(*head)->next;//p相当于尾指针
/*for(i=0;i{
q=(LinkList)malloc(sizeof(LNode));
q->data=i+1;
q->next=p;//这上面既要切记顺序问题,又要注意逻辑上能否恰当
p->next=(*head);
p=q;//这句代码意义是哪个呢?
printf("%d\n",q->data);
}/
for(i=0;i{
q=(LinkList)malloc(sizeof(LNode));
q->data=i+1;
p->next=q;
p=q;//使p指向最后一个节点
p->next=(*head);
//printf("%d\n",q->data);
}
}
void yuesefuList(LinkList head,int n,int m,int k)
{
int i,rec=0;
LinkList p,q;
p=head;
if(m>n)
{
printf("error!");
}
//将p依然指向报1的前一个人
//找到第m-1个人的位置c 循环链表,从下一个人开始报数
for(i=1;i{
p=p->next;
printf("%d\n",p->data);
/*if(p->next==head->next)
p=p->next;*///上面已经处理了m>n的情况
}
//开始报数
while(rec!=n){
q=p->next;//q指向报1的
for(i=1;i
{
p=q;
q=q->next;//q指向报i+1的人
if(q==head)//由于加了头结点,当循环到头结点时需要移动到下一个节点
{q=q->next;p=p->next;}//此时q记录的是报到k的人的前一个人
}
//本次循环之后,p指向报k-1的,q指向报k的
//delete
printf("%d \n",q->data);
p->next=q->next;
free(q);
rec++;
}
}
int main()
{
LinkList head;
int n,m,k;
printf("please enter the number of person\n");
printf("n=");
scanf("%d",&n);
printf("please enter the location of beginning\n");
printf("m=");
scanf("%d",&m);
printf("please enter the number of gap\n");
printf("k=");
scanf("%d",&k);
createlist(&head,n);
//inputlist(head,n);
yuesefuList(head,n,m,k);
return 0;
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-124774-1.html