如何在写一个学生学籍查询系统的程序,用单链表写了程序,但是查询功能和删除功能无法运行?

在写一个学生学籍查询系统的程序,用单链表写了程序,大体上写完,但是查询功能和删除功能无法运行,求解答!!

#include
#include
#include
#include
#include
#define Len sizeof (struct NODE)

struct INFORMATION              //基本信息
{
    char number[15];            //学号
    char name[20];              //姓名
    char sex[10];               //性别
    char dormitory[20];         //宿舍号码
    char telephone[20];         //电话号码
};   
struct GRADE                    //成绩信息
{
    char number[15];            //学号
    char name[20];              //姓名
    char subnumber [10][10];    //课程编号
    char subname [10][50];      //课程名称
    float credit[10];           //学分
    float usugrade[10];         //平时成绩
    float testgrade[10];        //实验成绩
    float scalgrade[10];        //卷面成绩
    float ovalgrade[10];        //综合成绩
    float finalcredit[10];      //实得学分
};
struct NODE  
{
    struct INFORMATION dataI;    //数据域
    struct GRADE dataG;
    struct NODE * next;          //指针域
};

typedef struct NODE Node;
typedef struct INFORMATION Info;
typedef struct GRADE Grade;
typedef Node *node;

node creatlist();                           //建立表头
node creatnode(node head);                  //信息录入
void insertnode(node head, node newnode);   //插入结点
void searchinfo (node head);                //查找基本信息
void searchgrade(node head);                //查找成绩信息
void search(node head);                     //信息查询
void delete(node head);                     //信息删除
void Freelink(node head);                   //释放链表
void menu();                                //菜单函数

node creatlist()                            //建立表头
{
    node headnode = (node)malloc(Len);
    headnode -> next = NULL;
    return headnode;
}

node creatnode(node head)                   //信息录入
{
    int n, choice;
    float g;
    do{
        system("cls");
        printf("---------------------------------\n");
        printf("    请选择要录入的学生信息\n");
        printf("        1:基本信息\n");
        printf("        2:成绩基本信息\n");
        printf("---------------------------------");
        n = getch();
        printf("\n");
        switch (n)
        {
            case '1' : 
            {
                char choice;
                do{
                    node newnode = (node)malloc(Len);
                    newnode->next = NULL;
                    system("cls");
                    printf("学号:");
                    scanf("%s", newnode->dataI.number);
                    printf("姓名:");
                    scanf("%s", newnode->dataI.name);
                    printf("性别:");
                    scanf("%s", newnode->dataI.sex);
                    printf("宿舍号码:");
                    scanf("%s", newnode->dataI.dormitory);
                    printf("电话号码:");
                    scanf("%s", newnode->dataI.telephone);
                    insertnode(head, newnode);
                    Sleep(500);
                    system("cls");
                    printf("录入成功!");
                    Sleep(500);
                    system("cls");
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }while (1);
            }break;
            case '2' : 
            {
                int i = 0;
                char choice;
                do{
                    node newnode = (node)malloc(Len);
                    newnode->next = NULL;
                    system("cls");
                    printf("学号:");
                    scanf("%s", newnode->dataG.number);
                    printf("姓名:");
                    scanf("%s", newnode->dataG.name);
                    for (i = 0; ; i++)
                    {
                        printf("课程编号:");
                        scanf("%s", newnode->dataG.subnumber[i]);
                        printf("课程名称:");
                        scanf("%s", newnode->dataG.subname[i]);
                        printf("学分:");
                        scanf("%f", &newnode->dataG.credit[i]);
                        printf("平时成绩:");
                        scanf("%f", &newnode->dataG.usugrade[i]);
                        printf("实验成绩:");
                        scanf("%f", &newnode->dataG.testgrade[i]);
                        printf("卷面成绩:");
                        scanf("%f", &newnode->dataG.scalgrade[i]);
                        if (newnode->dataG.testgrade[i] < 0)
                            newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.3 + newnode->dataG.scalgrade[i] * 0.7;
                        else
                            newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.15 + newnode->dataG.testgrade[i] * 0.15 + newnode->dataG.scalgrade[i] * 0.7;
                        g = newnode->dataG.ovalgrade[i];
                        if (g <= 100 && g >= 90)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i];
                        if (g < 90 && g >= 80)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.8;
                        if (g < 80 && g >= 70)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.75;
                        if (g < 70 && g >= 60)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.6;
                        if (g < 60)
                            newnode->dataG.finalcredit[i] = 0.0;
                        printf("\n");
                        newnode->dataG.number[i+1] = '\0';
                        newnode->dataG.name[i+1] = '\0';
                        newnode->dataG.subnumber[i][10] = '\0';
                        newnode->dataG.subname[i][50] = '\0';
                        printf("----------------------------------\n");
                        printf("      是否继续录入课程信息:\n");
                        printf("             1:是\n");
                        printf("             2:否\n");
                        printf("----------------------------------");
                        choice = getch();
                        printf("\n");
                        if (choice == '2')
                            break;
                    }
                    insertnode(head, newnode);
                    Sleep(500);
                    system("cls");
                    printf("录入成功!");
                    Sleep(500);
                    system("cls");
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    Sleep(500);
                    if (choice == '2')
                        break;
                }while(1);
            }break;
        }
        system("cls");
        printf("---------------------------------\n");
        printf("       是否继续录入信息:\n");
        printf("         1:是\n");
        printf("         2:返回菜单\n");
        printf("---------------------------------");
        choice = getch();
        if (choice == '2')
        {
            menu();
            break;
        }
    }while(1);
    return head;
}

void insertnode(node head, node newnode)                      //插入结点
{
    newnode->next = head->next;
    head->next = newnode;
}

void searchinfo (node head)                                   //查找基本信息
{
    system("cls");
    int n, choice;
    node p = head->next;
    do{
        printf("------------------------------\n");
        printf("        1:学号查找\n");
        printf("        2:姓名查找\n");
        printf("        3:宿舍查找\n");
        printf("------------------------------");
        n = getch();
        printf("\n");
        switch(n)
        {
        case'1':
            {
                
                char num[10];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的学生学号:");
                    scanf("%s", num);
                    printf("\n");
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (p->dataI.number[0] == '\0')
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.number,num) != 0)
                                p = p->next;
                            printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }    
            }break;
        case'2':
            {
                char name[20];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的姓名:");
                    scanf("%s", name);
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (p->dataI.name[0] == '\0')
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.name,name) == 0)
                                printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                            p = p->next;
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }
            }
        case'3':
            {
                char dorm[10];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的宿舍号码:");
                    scanf("%s", dorm);
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (p->dataI.dormitory[0] == '\0')
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.dormitory,dorm) == 0)
                                printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                            p = p->next;
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }
            }
        }
    }while(1);    
}

void searchgrade(node head)                                         //查找成绩信息
{
    system("cls");
    int i = 0, choice;
    float sum = 0.0;
    char num[10];
    node p = head->next;
    while(1)
    {
        printf("请输入查找的学生的学号:");
        scanf("%s", num);
        if (p == NULL)
        {
            Sleep(1000);
            printf("暂无数据!");
        }
        while(p != NULL)
        {
            printf("学号:%10s  姓名:%-20s\n",p->dataG.number, p->dataG.name);
            while(p->dataG.subnumber[i][0] != '\0' && p->dataG.subname[i][0] != '\0')
            {
                printf("课程编号:%-10s  课程名称:%-15s  综合成绩:%-5.1f  实得学分:%-5.1f\n", p->dataG.subnumber[i], p->dataG.subname[i], p->dataG.ovalgrade[i], p->dataG.finalcredit[i]);
                sum += p->dataG.finalcredit[i];
                i++;
            }
            printf("共修:%d 科  实得总学分为: %-5.1f\n", i, sum);
            p = p->next;
        }
        system("cls");
        printf("-----------------------------\n");
        printf("       是否继续查找:\n");
        printf("         1:是\n");
        printf("         2:返回上一级\n");
        printf("-----------------------------");
        choice = getch();
        if (choice == '2')
        {
            search(head);
            break;
        }
    }
}


void search(node head)                              //信息查询
{
    system("cls");
    int n;
    printf("---------------------------------\n");
    printf("      请选择要查询的学生信息\n");
    printf("         1:基本信息\n");
    printf("         2:成绩基本信息\n");
    printf("---------------------------------");
    n = getch();
    system("cls");
    printf("请稍后...");
    Sleep(500);
    printf("\n");
    switch (n)
    {
        case '1' : searchinfo(head);break;
        case '2' : searchgrade(head);break;
    }
}

void Delete(node head)                                          //信息删除
{
    system("cls");
    int n, flag = 0;
    node pre = head;
    node cure = head->next;
    char name[20];
    do
    {
        system("cls");
        printf("请输入要删除的学生姓名:");
        scanf("%s",name);
        Sleep(500);
        system("cls");
        if (pre->next == NULL)
            printf ("暂无数据!无法删除!");
        else
        {
            while (cure != NULL && strcmp(cure->dataI.name,name) != 0)
            {
                pre = cure;
                cure = pre->next;
            }
            if (pre->next == NULL)
                printf("查无此人!");
            else
            {
                pre->next = cure->next;
                flag = 1;
                if (flag)
                    printf("删除成功!");
                else
                    printf("删除失败!");
                Sleep(500);
                free (cure);//释放链表
            }
        }
        system("cls");
        printf("|    是否继续删除   |\n");
        printf("       1:确定\n");
        printf("       2:取消\n");
        n = getch();
        Sleep(500);
        if(n == '2')break;
    }while(1);
}

void Freelink(node head)             //释放链表
{
    node p = head->next;
    while(p)
    {
        head->next = p->next;//头指针指向下一个结点
        free(p);//释放结点
        p = head->next;
    }
}

void over(node head)
{
    system("cls");
    int n;
    printf("|   您确定要退出吗?  |\n");
    printf("       1:确定\n");
    printf("       2:取消\n");
    n = getch();
    while(1)
    {
        switch(n)
        {
        case'1':
            {
                system("cls");
                system("cls");
                printf("正在退出...");
                Sleep(1000);
                system("cls");
                printf("退出成功!");
                system("cls");
                printf("谢谢使用!");
                Freelink(head);
                exit(0);
                break;
            }
        case'2':
            {
                menu();
                break;
            }
            
        }
    }
}

void menu()
{
    node head = creatlist();
    do
    {
        system("cls");
        int n;
        printf("--------------------------------------\n");
        printf("|      学生学籍信息管理系统          |\n");      
        printf("--------------------------------------\n");
        printf("          1:信息录入\n");
        printf("          2:信息查询\n");
        printf("          3:信息删除\n");
        printf("          4:退出程序\n");
        printf("--------------------------------------\n");
        n = getch();
        Sleep(500);
        switch(n)
        {
            case'1':                          //信息录入
            {
                creatnode(head);
            }break;
            case'2':                          //信息查询
            {
                search(head);
            }break;
            case'3':                          //信息删除
            {
                Delete(head);
            }break;
            case'4':                          //退出程序
            over(head);break;    
        }
    }while(1);
}


int main()
{
    menu();
}













有几个问题如下

  1. menu函数里面的head createlist创建有问题,只能创建一次
  2. 查询的时候没有判断p是否为空,然后比较有问题
    代码如下修改,加上了下面连串等号的地方是修改的地方
    ========  
    
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#define Len sizeof (struct NODE)
struct INFORMATION              //基本信息
{
    char number[15];            //学号
    char name[20];              //姓名
    char sex[10];               //性别
    char dormitory[20];         //宿舍号码
    char telephone[20];         //电话号码
};   
struct GRADE                    //成绩信息
{
    char number[15];            //学号
    char name[20];              //姓名
    char subnumber [10][10];    //课程编号
    char subname [10][50];      //课程名称
    float credit[10];           //学分
    float usugrade[10];         //平时成绩
    float testgrade[10];        //实验成绩
    float scalgrade[10];        //卷面成绩
    float ovalgrade[10];        //综合成绩
    float finalcredit[10];      //实得学分
};
struct NODE  
{
    struct INFORMATION dataI;    //数据域
    struct GRADE dataG;
    struct NODE * next;          //指针域
};
typedef struct NODE Node;
typedef struct INFORMATION Info;
typedef struct GRADE Grade;
typedef Node *node;
node creatlist();                           //建立表头
node creatnode(node head);                  //信息录入
void insertnode(node head, node newnode);   //插入结点
void searchinfo (node head);                //查找基本信息
void searchgrade(node head);                //查找成绩信息
void search(node head);                     //信息查询
void Delete(node head);                     //信息删除
void Freelink(node head);                   //释放链表
void menu();                                //菜单函数
node creatlist()                            //建立表头
{
    node headnode = (node)malloc(Len);
    headnode -> next = NULL;
    return headnode;
}
node creatnode(node head)                   //信息录入
{
    int n, choice;
    float g;
    do{
        system("cls");
        printf("---------------------------------\n");
        printf("    请选择要录入的学生信息\n");
        printf("        1:基本信息\n");
        printf("        2:成绩基本信息\n");
        printf("---------------------------------");
        n = getch();
        printf("\n");
        switch (n)
        {
            case '1' : 
            {
                char choice;
                do{
                    node newnode = (node)malloc(Len);
                    newnode->next = NULL;
                    system("cls");
                    printf("学号:");
                    scanf("%s", newnode->dataI.number);
                    printf("姓名:");
                    scanf("%s", newnode->dataI.name);
                    printf("性别:");
                    scanf("%s", newnode->dataI.sex);
                    printf("宿舍号码:");
                    scanf("%s", newnode->dataI.dormitory);
                    printf("电话号码:");
                    scanf("%s", newnode->dataI.telephone);
                    insertnode(head, newnode);
                    Sleep(500);
                    system("cls");
                    printf("录入成功!");
                    Sleep(500);
                    system("cls");
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }while (1);
            }break;
            case '2' : 
            {
                int i = 0;
                char choice;
                do{
                    node newnode = (node)malloc(Len);
                    newnode->next = NULL;
                    system("cls");
                    printf("学号:");
                    scanf("%s", newnode->dataG.number);
                    printf("姓名:");
                    scanf("%s", newnode->dataG.name);
                    for (i = 0; ; i++)
                    {
                        printf("课程编号:");
                        scanf("%s", newnode->dataG.subnumber[i]);
                        printf("课程名称:");
                        scanf("%s", newnode->dataG.subname[i]);
                        printf("学分:");
                        scanf("%f", &newnode->dataG.credit[i]);
                        printf("平时成绩:");
                        scanf("%f", &newnode->dataG.usugrade[i]);
                        printf("实验成绩:");
                        scanf("%f", &newnode->dataG.testgrade[i]);
                        printf("卷面成绩:");
                        scanf("%f", &newnode->dataG.scalgrade[i]);
                        if (newnode->dataG.testgrade[i] < 0)
                            newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.3 + newnode->dataG.scalgrade[i] * 0.7;
                        else
                            newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.15 + newnode->dataG.testgrade[i] * 0.15 + newnode->dataG.scalgrade[i] * 0.7;
                        g = newnode->dataG.ovalgrade[i];
                        if (g <= 100 && g >= 90)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i];
                        if (g < 90 && g >= 80)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.8;
                        if (g < 80 && g >= 70)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.75;
                        if (g < 70 && g >= 60)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.6;
                        if (g < 60)
                            newnode->dataG.finalcredit[i] = 0.0;
                        printf("\n");
                        newnode->dataG.number[i+1] = '\0';
                        newnode->dataG.name[i+1] = '\0';
                        newnode->dataG.subnumber[i][10] = '\0';
                        newnode->dataG.subname[i][50] = '\0';

                        printf("----------------------------------\n");
                        printf("      是否继续录入课程信息:\n");
                        printf("             1:是\n");
                        printf("             2:否\n");
                        printf("----------------------------------");
                        choice = getch();
                        printf("\n");
                        if (choice == '2')
                            break;
                    }
                    insertnode(head, newnode);
                    Sleep(500);
                    system("cls");
                    printf("录入成功!");
                    Sleep(500);
                    system("cls");
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    Sleep(500);
                    if (choice == '2')
                        break;
                }while(1);
            }break;
        }
        system("cls");
        printf("---------------------------------\n");
        printf("       是否继续录入信息:\n");
        printf("         1:是\n");
        printf("         2:返回菜单\n");
        printf("---------------------------------");
        choice = getch();
        if (choice == '2')
        {
            menu();
            break;
        }
    }while(1);
    return head;
}
void insertnode(node head, node newnode)                      //插入结点
{
    newnode->next = head->next;
    head->next = newnode;
}
void searchinfo (node head)                                   //查找基本信息
{
    system("cls");
    int n, choice;
    node p = head->next;
    do{
        printf("------------------------------\n");
        printf("        1:学号查找\n");
        printf("        2:姓名查找\n");
        printf("        3:宿舍查找\n");
        printf("------------------------------");
        n = getch();
        printf("\n");
        switch(n)
        {
        case'1':
            {
                char num[10];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的学生学号:");
                    scanf("%s", num);
                    printf("\n");
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (!p || p->dataI.number[0] == '\0') ; //=============//
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.number,num) == 0)
                                //p = p->next; //=============//
                                printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                            p = p->next;
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }    
            }break;
        case'2':
            {
                char name[20];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的姓名:");
                    scanf("%s", name);
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (!p || p->dataI.name[0] == '\0') ; //=============//
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.name,name) == 0)
                                printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                            p = p->next;
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }
            }
        case'3':
            {
                char dorm[10];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的宿舍号码:");
                    scanf("%s", dorm);
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (p->dataI.dormitory[0] == '\0')
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.dormitory,dorm) == 0)
                                printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                            p = p->next;
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }
            }
        }
    }while(1);    
}
void searchgrade(node head)                                         //查找成绩信息
{
    system("cls");
    int i = 0, choice;
    float sum = 0.0;
    char num[10];
    node p = head->next;
    while(1)
    {
        printf("请输入查找的学生的学号:");
        scanf("%s", num);
        if (p == NULL)
        {
            Sleep(1000);
            printf("暂无数据!");
        }
        while(p != NULL)
        {
            printf("学号:%10s  姓名:%-20s\n",p->dataG.number, p->dataG.name);
            while(p->dataG.subnumber[i][0] != '\0' && p->dataG.subname[i][0] != '\0')
            {
                printf("课程编号:%-10s  课程名称:%-15s  综合成绩:%-5.1f  实得学分:%-5.1f\n", p->dataG.subnumber[i], p->dataG.subname[i], p->dataG.ovalgrade[i], p->dataG.finalcredit[i]);
                sum += p->dataG.finalcredit[i];
                i++;
            }
            printf("共修:%d 科  实得总学分为: %-5.1f\n", i, sum);
            p = p->next;
        }
        system("cls");
        printf("-----------------------------\n");
        printf("       是否继续查找:\n");
        printf("         1:是\n");
        printf("         2:返回上一级\n");
        printf("-----------------------------");
        choice = getch();
        if (choice == '2')
        {
            search(head);
            break;
        }
    }
}
void search(node head)                              //信息查询
{
    system("cls");
    int n;
    printf("---------------------------------\n");
    printf("      请选择要查询的学生信息\n");
    printf("         1:基本信息\n");
    printf("         2:成绩基本信息\n");
    printf("---------------------------------");
    n = getch();
    system("cls");
    printf("请稍后...");
    Sleep(500);
    printf("\n");
    switch (n)
    {
        case '1' : searchinfo(head);break;
        case '2' : searchgrade(head);break;
    }
}
void Delete(node head)                                          //信息删除
{
    system("cls");
    int n, flag = 0;
    node pre = head;
    node cure = head->next;
    char name[20];
    do
    {
        system("cls");
        printf("请输入要删除的学生姓名:");
        scanf("%s",name);
        Sleep(500);
        system("cls");
        if (pre->next == NULL)
            printf ("暂无数据!无法删除!");
        else
        {
            while (cure != NULL && strcmp(cure->dataI.name,name) != 0)
            {
                pre = cure;
                cure = pre->next;
            }
            if (pre->next == NULL)
                printf("查无此人!");
            else
            {
                pre->next = cure->next;
                flag = 1;
                if (flag)
                    printf("删除成功!");
                else
                    printf("删除失败!");
                Sleep(500);
                free (cure);//释放链表
            }
        }
        system("cls");
        printf("|    是否继续删除   |\n");
        printf("       1:确定\n");
        printf("       2:取消\n");
        n = getch();
        Sleep(500);
        if(n == '2')break;
    }while(1);
}
void Freelink(node head)             //释放链表
{
    node p = head->next;
    while(p)
    {
        head->next = p->next;//头指针指向下一个结点
        free(p);//释放结点
        p = head->next;
    }
}
void over(node head)
{
    system("cls");
    int n;
    printf("|   您确定要退出吗?  |\n");
    printf("       1:确定\n");
    printf("       2:取消\n");
    n = getch();
    while(1)
    {
        switch(n)
        {
        case'1':
            {
                system("cls");
                system("cls");
                printf("正在退出...");
                Sleep(1000);
                system("cls");
                printf("退出成功!");
                system("cls");
                printf("谢谢使用!");
                Freelink(head);
                exit(0);
                break;
            }
        case'2':
            {
                menu();
                break;
            }
        }
    }
}

node head = NULL; //==================//
void menu()
{
    if(head == NULL)    head = creatlist(); ; //=============//
    do
    {
        system("cls");
        int n;
        printf("--------------------------------------\n");
        printf("|      学生学籍信息管理系统          |\n");      
        printf("--------------------------------------\n");
        printf("          1:信息录入\n");
        printf("          2:信息查询\n");
        printf("          3:信息删除\n");
        printf("          4:退出程序\n");
        printf("--------------------------------------\n");
        n = getch();
        Sleep(500);
        switch(n)
        {
            case'1':                          //信息录入
            {
                creatnode(head);
            }break;
            case'2':                          //信息查询
            {
                search(head);
            }break;
            case'3':                          //信息删除
            {
                Delete(head);
            }break;
            case'4':                          //退出程序
            over(head);break;    
        }
    }while(1);
}
int main()
{
    menu();
}

delete是关键词!
建议把所有delete改成del

还有就是我试了一下你的search,没问题呀

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#define Len sizeof (struct NODE)
struct INFORMATION              //基本信息
{
    char number[15];            //学号
    char name[20];              //姓名
    char sex[10];               //性别
    char dormitory[20];         //宿舍号码
    char telephone[20];         //电话号码
};   
struct GRADE                    //成绩信息
{
    char number[15];            //学号
    char name[20];              //姓名
    char subnumber [10][10];    //课程编号
    char subname [10][50];      //课程名称
    float credit[10];           //学分
    float usugrade[10];         //平时成绩
    float testgrade[10];        //实验成绩
    float scalgrade[10];        //卷面成绩
    float ovalgrade[10];        //综合成绩
    float finalcredit[10];      //实得学分
};
struct NODE  
{
    struct INFORMATION dataI;    //数据域
    struct GRADE dataG;
    struct NODE * next;          //指针域
};
typedef struct NODE Node;
typedef struct INFORMATION Info;
typedef struct GRADE Grade;
typedef Node *node;
node creatlist();                           //建立表头
node creatnode(node head);                  //信息录入
void insertnode(node head, node newnode);   //插入结点
void searchinfo (node head);                //查找基本信息
void searchgrade(node head);                //查找成绩信息
void search(node head);                     //信息查询
void Delete(node head);                     //信息删除
void Freelink(node head);                   //释放链表
void menu(node head);                       //菜单函数
node creatlist()                            //建立表头
{
    node headnode = (node)malloc(Len);
    headnode -> next = NULL;
    return headnode;
}
node creatnode(node head)                   //信息录入
{
    int n, choice;
    float g;
    do{
        system("cls");
        printf("---------------------------------\n");
        printf("    请选择要录入的学生信息\n");
        printf("        1:基本信息\n");
        printf("        2:成绩基本信息\n");
        printf("---------------------------------");
        n = getch();
        printf("\n");
        switch (n)
        {
            case '1' : 
            {
                char choice;
                do{
                    node newnode = (node)malloc(Len);
                    newnode->next = NULL;
                    system("cls");
                    printf("学号:");
                    scanf("%s", newnode->dataI.number);
                    printf("姓名:");
                    scanf("%s", newnode->dataI.name);
                    printf("性别:");
                    scanf("%s", newnode->dataI.sex);
                    printf("宿舍号码:");
                    scanf("%s", newnode->dataI.dormitory);
                    printf("电话号码:");
                    scanf("%s", newnode->dataI.telephone);
                    insertnode(head, newnode);
                    Sleep(500);
                    system("cls");
                    printf("录入成功!");
                    Sleep(500);
                    system("cls");
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }while (1);
            }break;
            case '2' : 
            {
                int i = 0;
                char choice;
                do{
                    node newnode = (node)malloc(Len);
                    newnode->next = NULL;
                    system("cls");
                    printf("学号:");
                    scanf("%s", newnode->dataG.number);
                    printf("姓名:");
                    scanf("%s", newnode->dataG.name);
                    for (i = 0; ; i++)
                    {
                        printf("课程编号:");
                        scanf("%s", newnode->dataG.subnumber[i]);
                        printf("课程名称:");
                        scanf("%s", newnode->dataG.subname[i]);
                        printf("学分:");
                        scanf("%f", &newnode->dataG.credit[i]);
                        printf("平时成绩:");
                        scanf("%f", &newnode->dataG.usugrade[i]);
                        printf("实验成绩:");
                        scanf("%f", &newnode->dataG.testgrade[i]);
                        printf("卷面成绩:");
                        scanf("%f", &newnode->dataG.scalgrade[i]);
                        if (newnode->dataG.testgrade[i] < 0)
                            newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.3 + newnode->dataG.scalgrade[i] * 0.7;
                        else
                            newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.15 + newnode->dataG.testgrade[i] * 0.15 + newnode->dataG.scalgrade[i] * 0.7;
                        g = newnode->dataG.ovalgrade[i];
                        if (g <= 100 && g >= 90)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i];
                        if (g < 90 && g >= 80)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.8;
                        if (g < 80 && g >= 70)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.75;
                        if (g < 70 && g >= 60)
                            newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.6;
                        if (g < 60)
                            newnode->dataG.finalcredit[i] = 0.0;
                        printf("\n");
                        newnode->dataG.number[i+1] = '\0';
                        newnode->dataG.name[i+1] = '\0';
                        newnode->dataG.subnumber[i][10] = '\0';
                        newnode->dataG.subname[i][50] = '\0';
                        printf("----------------------------------\n");
                        printf("      是否继续录入课程信息:\n");
                        printf("             1:是\n");
                        printf("             2:否\n");
                        printf("----------------------------------");
                        choice = getch();
                        printf("\n");
                        if (choice == '2')
                            break;
                    }
                    insertnode(head, newnode);
                    Sleep(500);
                    system("cls");
                    printf("录入成功!");
                    Sleep(500);
                    system("cls");
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    Sleep(500);
                    if (choice == '2')
                        break;
                }while(1);
            }break;
        }
        system("cls");
        printf("---------------------------------\n");
        printf("       是否继续录入信息:\n");
        printf("         1:是\n");
        printf("         2:返回菜单\n");
        printf("---------------------------------");
        choice = getch();
        if (choice == '2')
        {
            menu(head);
            break;
        }
    }while(1);
    return head;
}
void insertnode(node head, node newnode)                      //插入结点
{
    newnode->next = head->next;
    head->next = newnode;
}
void searchinfo (node head)                                   //查找基本信息
{
    system("cls");
    int n, choice;
    node p = head->next;
    do{
        printf("------------------------------\n");
        printf("        1:学号查找\n");
        printf("        2:姓名查找\n");
        printf("        3:宿舍查找\n");
        printf("------------------------------");
        n = getch();
        printf("\n");
        switch(n)
        {
        case'1':
            {
                char num[10];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的学生学号:");
                    scanf("%s", num);
                    printf("\n");
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (p == NULL || p->dataI.number[0] == '\0')
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.number,num) == 0)
                            {
                                printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                                break;
                            }
                            p = p->next;
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }    
            }break;
        case'2':
            {
                char name[20];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的姓名:");
                    scanf("%s", name);
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (p == NULL || p->dataI.name[0] == '\0')
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.name,name) == 0)
                                printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                            p = p->next;
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }
            }
        case'3':
            {
                char dorm[10];
                while(1)
                {
                    system("cls");
                    printf("请输入查找的宿舍号码:");
                    scanf("%s", dorm);
                    printf("    学号       姓名            性别   宿舍号码            电话号码     \n");
                    if (p == NULL || p->dataI.dormitory[0] == '\0')
                        printf("暂无数据!\n");
                    else
                    {
                        while(p != NULL)
                        {
                            if (strcmp(p->dataI.dormitory,dorm) == 0)
                                printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
                            p = p->next;
                        }
                    }
                    printf("---------------------------------\n");
                    printf("       是否继续录入信息:\n");
                    printf("         1:是\n");
                    printf("         2:返回上一级\n");
                    printf("---------------------------------");
                    choice = getch();
                    if (choice == '2')
                        break;
                }
            }
        }
    }while(1);    
}
void searchgrade(node head)                                         //查找成绩信息
{
    system("cls");
    int i = 0, choice;
    float sum = 0.0;
    char num[10];
    node p = head->next;
    while(1)
    {
        printf("请输入查找的学生的学号:");
        scanf("%s", num);
        if (p == NULL)
        {
            Sleep(1000);
            printf("暂无数据!");
        }
        while(p != NULL)
        {
            printf("学号:%10s  姓名:%-20s\n",p->dataG.number, p->dataG.name);
            while(p->dataG.subnumber[i][0] != '\0' && p->dataG.subname[i][0] != '\0')
            {
                printf("课程编号:%-10s  课程名称:%-15s  综合成绩:%-5.1f  实得学分:%-5.1f\n", p->dataG.subnumber[i], p->dataG.subname[i], p->dataG.ovalgrade[i], p->dataG.finalcredit[i]);
                sum += p->dataG.finalcredit[i];
                i++;
            }
            printf("共修:%d 科  实得总学分为: %-5.1f\n", i, sum);
            p = p->next;
        }
        system("cls");
        printf("-----------------------------\n");
        printf("       是否继续查找:\n");
        printf("         1:是\n");
        printf("         2:返回上一级\n");
        printf("-----------------------------");
        choice = getch();
        if (choice == '2')
        {
            search(head);
            break;
        }
    }
}
void search(node head)                              //信息查询
{
    system("cls");
    int n;
    printf("---------------------------------\n");
    printf("      请选择要查询的学生信息\n");
    printf("         1:基本信息\n");
    printf("         2:成绩基本信息\n");
    printf("---------------------------------");
    n = getch();
    system("cls");
    printf("请稍后...");
    Sleep(500);
    printf("\n");
    switch (n)
    {
        case '1' : searchinfo(head);break;
        case '2' : searchgrade(head);break;
    }
}
void Delete(node head)                                          //信息删除
{
    system("cls");
    int n, flag = 0;
    node pre = head;
    node cure = head->next;
    char name[20];
    do
    {
        system("cls");
        printf("请输入要删除的学生姓名:");
        scanf("%s",name);
        Sleep(500);
        system("cls");
        if (pre->next == NULL)
            printf ("暂无数据!无法删除!");
        else
        {
            while (cure != NULL && strcmp(cure->dataI.name,name) != 0)
            {
                pre = cure;
                cure = cure->next;
            }
            if (pre->next == NULL)
                printf("查无此人!");
            else
            {
                pre->next = cure->next;
                flag = 1;
                if (flag)
                    printf("删除成功!");
                else
                    printf("删除失败!");
                Sleep(500);
                free (cure);//释放链表
            }
        }
        system("cls");
        printf("|    是否继续删除   |\n");
        printf("       1:确定\n");
        printf("       2:取消\n");
        n = getch();
        Sleep(500);
        if(n == '2')break;
    }while(1);
}
void Freelink(node head)             //释放链表
{
    node p = head->next;
    while(p)
    {
        head->next = p->next;//头指针指向下一个结点
        free(p);//释放结点
        p = head->next;
    }
}
void over(node head)
{
    system("cls");
    int n;
    printf("|   您确定要退出吗?  |\n");
    printf("       1:确定\n");
    printf("       2:取消\n");
    n = getch();
    while(1)
    {
        switch(n)
        {
        case'1':
            {
                system("cls");
                system("cls");
                printf("正在退出...");
                Sleep(1000);
                system("cls");
                printf("退出成功!");
                system("cls");
                printf("谢谢使用!");
                Freelink(head);
                exit(0);
                break;
            }
        case'2':
            {
                menu(head);
                break;
            }
        }
    }
}
void menu(node head)
{
    do
    {
        system("cls");
        int n;
        printf("--------------------------------------\n");
        printf("|      学生学籍信息管理系统          |\n");      
        printf("--------------------------------------\n");
        printf("          1:信息录入\n");
        printf("          2:信息查询\n");
        printf("          3:信息删除\n");
        printf("          4:退出程序\n");
        printf("--------------------------------------\n");
        n = getch();
        Sleep(500);
        switch(n)
        {
            case'1':                          //信息录入
            {
                creatnode(head);
            }break;
            case'2':                          //信息查询
            {
                search(head);
            }break;
            case'3':                          //信息删除
            {
                Delete(head);
            }break;
            case'4':                          //退出程序
            over(head);break;    
        }
    }while(1);
}
int main()
{
    node head = creatlist();
    menu(head);
}

部分功能无法运行?