69,059
社区成员




#include <stdio.h>
#include <stdlib.h>
struct LNode{
int Num; //序号
int Code; //密码
struct LNode* Next;
};
typedef struct LNode* List;
List CreatList(){
int count;
int i; //工具
printf("请输入玩游戏的人数:\n");
scanf("%d",&count);
List head,L; //没有头节点,头指针的位置不要动,要不可能就返回空
L=head;
//没有头结点,则第一个单独拎出来
List tmp_1=(List)malloc(sizeof(struct LNode));
tmp_1->Num=1;
printf("请输入第1个人的密码:\n");
scanf("%d",&tmp_1->Code);
tmp_1->Next=tmp_1;
L=tmp_1;
for(i=2;i<=count;i++){
List tmp=(List)malloc(sizeof(struct LNode));
tmp->Num=i;
printf("请输入第%d个人的密码:\n");
scanf("%d",&tmp->Code);
tmp->Next=tmp_1; //指向头,形成循环
L->Next=tmp;
L=L->Next;
}
//错误点:未形成循环
L->Next=head;
return head;
}
//检验链表是否完成
void Display(List L){
List ptr;
ptr=L;
if(ptr){
do{
printf("%d",ptr->Code);
ptr=ptr->Next;
}while(ptr->Next!=L);
}
}
void PlayList(List L){
int m;
List ptr; //遍历整个链表的指针
printf("请输入报数上限m:\n");
scanf("%d",&m);
//单独判断表头
if(L->Code==m){
printf("%d",L->Num);
ptr=L;
while(ptr->Next!=L){
ptr=ptr->Next;
}
ptr->Next=L->Next; //链尾指针修改
free(L);
L=ptr->Next; //链头指针修改
}
while(L->Next){
if(L->Next->Code==m){
printf("%d",L->Next->Num);
m=L->Next->Code;
//删除这个结点
List temp;
temp=L->Next;
L->Next=temp->Next;
free(temp);
}
L=L->Next;
}
}
int main()
{
List L;
L=CreatList();
Display(L);
PlayList(L);
}
改了三天了,还是找不出来,感觉自己就是对的,救救孩子吧
出错的地方:链表显示不出来
要求:
输入:m的初值为20;
n=7;
7个人的密码依次为 3,1,7,2,4,8,4。
输出:正确的出列顺序为 6,1,4,7,2,3,5。
我意见PlayList 函数 :(主要你上面这代码,我看不到报数逻辑,反而像是用密码去匹配m)
void PlayList(List L){
int m;
List tear; //遍历整个链表的指针
printf("请输入报数上限m:\n");
scanf("%d",&m);
tear=L;
int count=1;
while(tear->Next!=L){ //tear指针指向尾部
tear=tear->Next;
count++;
}
int j=1;
while(j<=count){
for(int i=1;i<m;i++){ //根据m报数轮转,L指向要弹出的元素
L=L->Next;
tear=tear->Next;
}
printf("%d",L->Num); //输出元素序号
List p=(List)malloc(sizeof(struct LNode));
p=L;
m=L->Code; //m更新为弹出元素的密码
L=L->Next;
tear->Next=L;
free(p);
j++;
}
}