有很多AC只有一个WA,单链表学生信息问题

问题遇到的现象和发生背景

请设计一个简单的学生成绩管理系统,要求系统实现以下功能:
学生信息包括学号、姓名、性别、语文、数学、英语。
插入学生信息:
Insert id name sex x y z 其中的参数分别为学号、姓名、性别、三门课的成绩,成绩为浮点数。如果链表中已经存在相同学号的学生信息,插入失败。
输出所有学生信息:
List
按照学号从小到大的顺序输出所有学生的信息,每行一位学生的信息。每行的格式如下:
id name sex x y z
数据之间用一个空格分隔,成绩保留1位小数。
查找学生信息:
Find id
查找学号为id的学生信息。
修改学生信息:
Change id newname,newx,newy,newz
把学号为id的学生信息修改为newname,newx,newy,newz(学号保持不变)
删除学生信息:
Delete id
删除学号为id的学生信息
退出程序:
Quit或者Exit

问题相关代码,请勿粘贴截图
#include<bits/stdc++.h>
using namespace std;
struct ElementType{
    char id[20];
    char name[30];
    char sex[5];
    double x,y,z;
};
typedef struct Node{
    ElementType data;
    struct Node *next; 
}Node,*LinkList;
LinkList createList()               //创建单链表 
{
    LinkList L;
    L=(LinkList)malloc(sizeof(Node));
    L->next=NULL;
    return L;
}
LinkList find(LinkList L,char c[])
{
    LinkList p;
    p=L->next;
    while(p!=NULL){
        if(strcmp(p->data.id,c)==0) return p;
        p=p->next;
    }
    return p;
}
LinkList input()
{
    LinkList S;
    S=(LinkList)malloc(sizeof(Node));
    S->next=NULL;
    scanf("%s%s%s",S->data.id,S->data.name,S->data.sex);
    scanf("%lf%lf%lf",&S->data.x,&S->data.y,&S->data.z);
    return S;
}
void charu(LinkList L,LinkList S)
{
    LinkList p,pre;
    pre=L;
    p=L->next;
    while(p!=NULL){
        pre=p;
        p=p->next;
    }
    S->next=NULL;
    pre->next=S;
}
void output(LinkList S)
{
    printf("%s %s %s ",S->data.id,S->data.name,S->data.sex);
    printf("%.1f %.1f %.1f\n",S->data.x,S->data.y,S->data.z);
}
void List(LinkList L)
{
    L=L->next;
    while(L){
        output(L);
        L=L->next;
    }
}
void change(LinkList L,LinkList S)
{
    LinkList p,pre;
    pre=L;
    p=L->next;
    while(p!=NULL){
        if(strcmp(p->data.id,S->data.id)==0) break;
        pre=p;
        p=p->next;
    }
    pre->next=S;
    S->next=p->next;
}
void Delete(LinkList L,char c[])
{
    LinkList p,pre;
    pre=L;
    p=L->next;
    while(p!=NULL){
        if(strcmp(p->data.id,c)==0) break;
        pre=p;
        p=p->next;
    }
    pre->next=p->next;
}
void sort(LinkList L)
{
    LinkList p,pre,t;
    pre=L->next;
    p=pre->next;
    while(pre){
        t=pre;
        p=pre->next;
        while(p){
            if(strcmp(pre->data.id,p->data.id)>0) t=p;
            p=p->next;
        }
        if(t!=pre) swap(t->data,pre->data);
        pre=pre->next;
    }
}
int main(){
    char order[20];
    char c[20];
    LinkList L;
    LinkList S;
    L=createList(); 
    while(1){
        scanf("%s",order);
        if(!strcmp(order,"Insert")){
            puts("Insert:");
            S=input();
            if(find(L,S->data.id)==NULL){
                charu(L,S);
                output(S);
            }
            else printf("Failed\n");
        }
        else if(!strcmp(order,"List")){
            puts("List:");
            sort(L);
            List(L);
        }
        else if(!strcmp(order,"Change")){
            puts("Change:");
            S=input();
            if(find(L,S->data.id)!=NULL){
                output(S);
                change(L,S);
            }
            else printf("Failed\n");
        }
        else if(!strcmp(order,"Find")){
            puts("Find:");
            scanf("%s",c);
            if(find(L,c)!=NULL){
                output(find(L,c));
            }
            else printf("Failed\n");
        }
        else if(!strcmp(order,"Delete")){
            puts("Delete:");
            scanf("%s",c);
            if(find(L,c)!=NULL){
                puts("Deleted");
                Delete(L,c);
            }
            else printf("Failed\n");
        }
        else{
            puts("Good bye!");
            break;
        }
    }
    return 0;
}

运行结果及报错内容

很多AC加一个WA

我的解答思路和尝试过的方法
我想要达到的结果