c语言程序没跑完就结束了

img


#include <stdio.h>
#include <stdlib.h>

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;
}