40分求解---大一题库:循环链表,求改错
题目要求:13个人围成一圈,从第一个人开始顺序报数1,2,3;凡报到3的就退出圈子。找出最后留在圈子中的人的原来序号。思路:1.13个人,分别是13个节点,构成一个循环列表;
2.对13个人分别进行标号(从1,2一直到13);
3.3个人一个小循环;报到3的人就删除链表;
程序如下:
#include <stdio.h>
#define k 13
#define null 0
struct stu
{
int num; /////num代表每次报的号数(1,2,3);
int origi; ////origi代表每个人的序号,这个序号是一直不变的
struct stu *next;
};
struct stu *creat(void) ////建立循环链表,13个人手牵手,围成一圈
{
struct stu *p1,*p2,*head;
int i;
head=p1=p2=(struct stu*)malloc(sizeof(struct stu));
for(i=0;i<k;i++)
{
p1=(struct stu*)malloc(sizeof(struct stu));
p2->next=p1;
p2=p1;
}
p2->next=head;
return(head);
}
struct stu giveori(struct stu *head) ///对13个人的编号赋值(1到13)
{
struct stu *p1;
int i;
p1=head;
for(i=1;i<=k;i++)
{
p1->origi=i;
p1=p1->next;
}
}
struct stu givenum(struct stu *head) /////进行报数,1到3
{
struct stu *p1;
int i;
p1=head;
for(i=1;i<=3;i++)
{
p1->num=i;
p1=p1->next;
}
}
struct stu *del(struct stu *head) /////发现报3就删除
{
struct stu *p1,*p2;
p1=p2=head;
while(p1->num!=3)
{
p2=p1;
p1=p1->next;
}
if(p1->num==3)
{
p2->next=p1->next;
free(p1);
}
return(p2->next);
}
void main()
{
int count=0;
struct stu *head;
head=creat();
giveori(head);
while(count<k-1)
{
givenum(head);
head=del(head);
count++;
}
printf("\n%d",head->origi);
getch();
}
[ 本帖最后由 t1melost 于 2011-3-31 12:40 编辑 ]