typedef struct Node
{
int num;//序号
int data;//密码
struct LNode* next;
}Node, *LinkList;
int delateQ_data = 0;
LinkList IniList()
{
LinkList head;
head = (LinkList)malloc(sizeof(Node));
if (head)
head->next = NULL;
return head;
}
LinkList CreateListR(int a[], int n)
{
LinkList head = IniList;
LinkList r = head;
for (int i = 0;i < n;i++)
{
LinkList p = (LinkList)malloc(sizeof(Node));
if (p)
{
p->data = a[i];
r->next = p;
r = p;
printf("num:%d,p:%d\n", p->num, p->data);
}
}
r->next = head->next;
return head;
}
LinkList LinkDelete(LinkList* L, int i)
{
LinkList p, q;
p = *L;
int j;
for (j = 0;j < i - 1;j++)
p = p->next;
q = p->next;
p->next = q->next;
printf("num:%d 出局\n", q->num);
delateQ_data = q->data;
free(q);
return p;
}
int StartGame(LinkList *L, int n, int m)
{
LinkList q = *L;
int firstln = 1;
while (n - 1)
{
if (firstln)
{
q = LinkDelete(q, m);
firstln = 0;
}
else
q = LinkDelete(q, delateQ_data);
n--;
}
if (n == 1)
q = q->next;
return q->num;
}
int main(void)
{
int p[30], n = 0, first_m;
LinkList head;
printf("请输入初始m值:\n");
scanf_s("%d", &first_m);
printf("请依次输入密码,以非整数字符结束。\n");
while (scanf("%d", &p[n++]));
printf("参加人数:%d\n初始m值:%d\n", n - 1, first_m);
head = CreateListR(p, n - 1);
printf("游戏过程:\n");
printf(("获胜者是%d号\n", StartGame(head, n - 1, first_m)));
return 0;
}
修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node
{
int num;//序号
int data;//密码
struct Node* next; //struct LNode* next;
}Node, * LinkList;
int delateQ_data = 0;
LinkList IniList()
{
LinkList head;
head = (LinkList)malloc(sizeof(Node));
if (!head) return NULL;
head->next = NULL;
return head;
}
LinkList CreateListR(int a[], int n)
{
LinkList head = IniList();//LinkList head = IniList;
LinkList r = head;
for (int i = 0; i < n; i++)
{
LinkList p = (LinkList)malloc(sizeof(Node));
if (!p) return NULL; //修改
p->data = a[i];
p->num = i + 1; //修改
r->next = p;
r = p;
printf("num:%d,p:%d\n", p->num, p->data);
}
r->next = head->next;
return head;
}
LinkList LinkDelete(LinkList L, int i)//*L 修改
{
LinkList p, q;
p = L;
int j;
for (j = 0; j < i - 1; j++)
p = p->next;
q = p->next;
p->next = q->next;
printf("num:%d 出局\n", q->num);
delateQ_data = q->data;
free(q);
return p;
}
int StartGame(LinkList* L, int n, int m)
{
LinkList q = (*L);
int firstln = 1;
while (n-1)
{
if (firstln)
{
q = LinkDelete(q,m);
firstln = 0;
}
else
q = LinkDelete(q, delateQ_data);
n--;
}
if (n == 1)
q = q->next;
return q->num;
}
int main(void)
{
int p[30], n = 0, first_m;
LinkList head;
printf("请输入初始m值:\n");
scanf_s("%d", &first_m);
printf("请依次输入密码,以 -1 结束输入。\n");
while (scanf("%d", &p[n]) == 1 && p[n] != -1) n++; //修改
printf("参加人数:%d\n初始m值:%d\n", n, first_m); //修改
head = CreateListR(p, n); //修改
printf("游戏过程:\n");
printf("获胜者是%d号\n", StartGame(&head, n-1, first_m));
return 0;
}