两个删除模块和排序有问题,一输入学号或成绩删除信息,还有排序就直接不走了

#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;
typedef int ElemType;
typedef char ZF;

struct LNode
{
    ZF name[20];//名字
    ElemType num;//学号
    ElemType data;//成绩
    struct LNode *next;//指针域
};

typedef struct LNode LNode;
typedef struct LNode* LinkList;

//初始化
Status InitList(LinkList &L)
{
    L=new LNode;
    L->next=NULL;
    return OK;
}

//插入
Status ListInsert(LinkList &L,int i,ElemType xh,ZF xm[20],ElemType cj)// 学号  姓名  成绩
{
    if(i<1) return ERROR;

    LNode *p=L;
    int j=0;
    while(p!=NULL&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p==NULL) return ERROR;

    LNode *s=new LNode;
    s->num=xh;
    //s->name[20]=xm[20];格式错误
    strcpy(s->name,xm);//C++赋值给字符串的格式
    s->data=cj;

    s->next=p->next;
    p->next=s;

    return OK;
}

Status ZJ(LinkList &L,int n)//增加信息
{
    int i;
    ElemType xh,cj;
    ZF xm[20];
    for(i=0;i<n;i++)
    {
        cout<<endl;
        cout<<"学号:";
        cin>>xh;
        cout<<"姓名:";
        cin>>xm;
        cout<<"成绩:";
        cin>>cj;
        ListInsert(L,i+1,xh,xm,cj);//插入
    }
    return OK;
}

//学生个数(链表长度)
Status GetLenght(LinkList L)
{
    int l;
    LNode *p=L->next;
    for(l=0;p!=NULL;l++)
    {
        p=p->next;
    }
    return l;
}

//按学号查找成绩
Status XhGetScore(LinkList L,ElemType xh,ElemType &cj)
{
    int i,l;
    l=GetLenght(L);
    LNode *p=L->next;
    cj=-1;
    for(i=0;i<l;i++)
    {
        if(xh==p->num)
        {
            cj=p->data;
            //cout<<p->data<<endl;
            //return cj;
        }
        else p=p->next;
    }

    //没有这个学号
    if(p==NULL&&cj==-1)//if(i==l-1&&xh!=p->data) 
    {
        cout<<"学号输入有误,请重新输入"<<endl;
        return ERROR;
    }
    else return cj;
}


//按学号删除
Status XhDelete(LinkList &L,ElemType xh)
{
    int i,l;
    l=GetLenght(L);
    LNode *p=L;
    LNode *s;
    for(i=0;i<=l;i++)
    {
        if(xh==p->next->data)
        {
            s=p->next;
            p->next=s->next;
            delete s;

            return OK;
        }
        p=p->next;
    }

    if(p->next==NULL)
    {
        cout<<"学号输入有误,请重新输入"<<endl;
        return ERROR;
    }
}


//按成绩删除
Status ScoreDelete(LinkList &L,ElemType cj)
{
    int i,l;
    l=GetLenght(L);
    LNode *p=L;
    LNode *s;
    for(i=0;i<=l;i++)
    {
        if(p->next->data==cj)
        {
            s=p->next;
            p->next=s->next;
            delete s;

            return OK;
        }
        p=p->next;
    }
    //return OK;
}

//按成绩重新排序结点
Status PX(LinkList &L)
{
    int i,j,l;
    LNode *p=L->next;
    LNode *s,*d;
    l=GetLenght(L);
    for(i=0;i<l-1;i++)
    {
        d=L;
        for(j=0;j<i+1;j++)
        {
            if(d->next->data<p->next->data)
            {
                s=p->next;
                p->next=s->next;
                s->next=d->next;
                d->next=s;
                break;
            }
            d=d->next;
        }
        p=p->next;
    }
    return OK;
}

//遍历
Status TraverseList(LinkList L)
{
    LNode *p=L->next;
    cout<<"=====学生信息====="<<endl;
    while(p!=NULL)
    {
        cout<<"--------------------"<<endl;
        cout<<"学号:"<<p->num<<endl;
        cout<<"姓名:"<<p->name<<endl;
        cout<<"成绩:"<<p->data<<endl;
        p=p->next;
    }
    cout<<"--------------------"<<endl;
    return OK;
}

//销毁
void DestroyList(LinkList &L)
{
    LNode *p;
    while(L!=NULL)
    {
        p=L->next;
        delete L;
        L=p;
    }
}

//主函数
int main()
{
    LinkList L;
    InitList(L);//初始化
    ElemType cj,xh,result;
    ZF xm[20];
    int x,n,i;
    cout<<"*****************菜单******************"<<endl;
    cout<<"======================================="<<endl;
    cout<<"***    0:   增加学生信息           ***"<<endl;
    cout<<"***    1:查找学生信息(按学号)    ***"<<endl;
    cout<<"***    2:删除学生信息(按学号)    ***"<<endl;
    cout<<"***    3:删除学生信息(按成绩)    ***"<<endl;
    cout<<"***    4:按成绩由高分到低分排序    ***"<<endl;
    cout<<"***    5:  显示所有学生信息        ***"<<endl;
    cout<<"======================================="<<endl;
loop:
    cout<<"请输入对应数字:";
    cin>>x;
    switch(x)
    {
        case 0://增加学生信息
            cout<<"\n请输入增加学生个数:";
            cin>>n;
            ZJ(L,n);
            break;
        case 1://按学号查找学生信息
            cout<<"\n请输入学号,查找成绩:";
            cin>>xh;
            XhGetScore(L,xh,result);
            if(result!=-1) cout<<"该生成绩:"<<result<<endl;
            break;
        case 2://删除学生信息(按学号)
            cout<<"\n请输入学号,删除该信息:";
            cin>>xh;
            XhDelete(L,xh);
            break;
        case 3://删除学生信息(按成绩)
            cout<<"\n请输入成绩,删除该信息:";
            cin>>cj;
            ScoreDelete(L,cj);
            break;
        case 4://按成绩排序
            cout<<"\n按成绩排序(高分到低分):"<<endl;
            PX(L);
            TraverseList(L);
            break;
        case 5:
            TraverseList(L);
            break;//显示所有学生信息
        default:cout<<" ! ! ! 输入信息有误 ! ! ! "<<endl;
    }
    cout<<"\n*****继续操作,请按1*****"<<endl;
    cout<<"*****结束操作,请按2*****\n"<<endl;
    cin>>i;
    if(i==1) goto loop;
    
    DestroyList(L);//销毁

    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^