c语言中调用一个函数之后为什么直接导致了程序结束?

在执行case 6和case 8时调用SelectFavorite函数和Insert时直接结束了运行是怎么回事🤔

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAX 6
typedef struct node
{
    char num[15];
    char name[10];
    float price;
}ElemType;
typedef ElemType *Triplet;
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
static int NUM=0;
void Print(Triplet);
Status InitTriplet(Triplet *T)

{
    int n=1;
    char str1[15]="0";
    char str2[15]="0";
    (*T)=(ElemType*)malloc(MAX*sizeof(ElemType));
    srand ((unsigned)time(NULL));
    if((*T)==NULL)
        return OVERFLOW;
        printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
        scanf("%s%s%f",&(*T)[n].num[0],&(*T)[n].name[0],&(*T)[n].price);
    while(strcmp((*T)[n].num,str1)!=0||strcmp((*T)[n].name,str2)!=0||(*T)[n].price!=0){

            n++;
            NUM++;
            printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
        scanf("%s%s%f",&(*T)[n].num[0],&(*T)[n].name[0],&(*T)[n].price);
        }
    return NUM;
}
Status CreatTriplet(Triplet *T,int n)

{
    int i;    
    (*T)=(ElemType*)malloc(n*sizeof(ElemType));
        srand ((unsigned)time(NULL));
        if((*T)==NULL)
            return OVERFLOW;
        for(i=1;i<=n;i++)
        {
            printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
            scanf("%s%s%f",&(*T)[i].num[0],&(*T)[i].name[0],&(*T)[i].price);
        }
        return OK;
}
Status DestroyTriplet(Triplet T)
{
    free(T);
    T=NULL;
    return OK;
}
void Descending(Triplet T)
{
    float jiage;
    int i,j;
    for(i=1;i<=NUM-1;i++)
        for(j=1;j<=NUM-i;j++)
            if(T[j+1].price>T[j].price)
            {
                jiage=T[j].price;
                T[j].price=T[j+1].price;
                T[j+1].price=jiage;
            }

}
void Pricemodify(Triplet T)

{
    int i;
    float sum,average;
    sum=0;
    average=0;
    for(i=1;i<=NUM;i++)
    {
        sum+=T[i].price;
    }
    average=sum/(NUM*1.00);
    printf("%.2f",average);
    for(i=1;i<=NUM;i++)
    {
        if(T[i].price<average)
            T[i].price+=T[i].price*0.2;
        else T[i].price+=T[i].price*0.1;
    }

}
void Inversion(Triplet T,int n)

{
    int i; 
    char str1[15];
    char str2[10];
    float temp;
    for(i=1;i<=(n/2);i++)
    {
        strcpy(str1,T[i].num);
        strcpy(T[i].num,T[n-i].num);
        strcpy(T[n-i].num,str1);
        strcpy(str2,T[i].name);
        strcpy(T[i].name,T[n-i].name);
        strcpy(T[n-i].name,str2);
        temp=T[i].price;
        T[i].price=T[n-i].price;
        T[n-i].price=temp;
    }
}
void SelectExpensive(Triplet T,int n)

{
    int i;
    int count;
    float max;
    count=0;
    max=T[1].price;
    for(i=1;i<=n;i++)
    {
        if(max<T[n].price)
            max=T[n].price;
    }
    for(i=1;i<=n;i++)
    {
        if(T[i].price==max)
            count++;
    }
    printf("%d\n",count);

    for(i=1;i<=n;i++)
    {
        if(T[i].price==max)
            printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
            printf("\n");
    
    }
}
//void Input(int n)

//{
//    int i;
//    char str[10][15];
//    printf("请输入%d个最爱图书的名称:\n",n);
//    for(i=1;i<=n;i++)
 //  scanf("%14s",str[i][15]);
//}
void SelectFavorite(Triplet T,int num,int m)

{
    int count;
    int i,j;
    char str[MAX][15];
    count=0;
    printf("请输入最爱图书的名称:\n");
    for(i=1;i<=m;i++)
        scanf("%s",&str[i][15]);
    
       for(i=1;i<=m;i++)
    {
        for(j=1;j<=num;j++)
        {
        if(strcmp(str[i][15],T[j].name)==0)
        {
            printf("%14s %9s %.2f",T[j].num,T[j].name,T[j].price);
            count++;
            printf("\n");
        }
        }
    }
    printf("%d\n",count);

        if(count==0)
        printf("抱歉,没有你的最爱\n");
}
void SelectPoint(Triplet T,int n)

{
    int i;
    int point[MAX];
    printf("请输入想要查找的图书的位置:\n");
    for(i=1;i<=n;i++)
        scanf("%d",&point[i]);
    for(i=1;i<=n;i++)
    {
        if(point[i]==0)
            printf("抱歉,最佳位置上的图书不存在!\n");
        else 
        {
            printf("%14s%9s%.2f",T[point[i]].num,T[point[i]].name,T[point[i]].price);
            printf("\n");
        }
    }
    
}
void Insert(Triplet T,ElemType e,int num,int n)

{
    int i; 
//    for(i=1;i<n;i++)
//    {
//    printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
//    printf("\n");
//    }
//    printf("%14s %9s %.2f",T[n].num,T[n].name,T[n].price);
//    printf("\n");
    for(i=num+1;i>n;i--)
    {
        T[i]=T[i-1];

       // printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        //printf("\n");
    }
    T[n]=e;
}
void Delete(Triplet T,int n,int num)

{
    int i;
    for(i=num;i<n;i++)
        T[num]=T[num+1];
}
int DeleteRepeat(Triplet T,int n)
{
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(strcmp(T[j].num,T[i].num)==0)
            {
                for(k=j+1;k<=n;k++)
                    T[k-1]=T[k];
                n--;
            }
        }
    }
      return n;
}
void Print_dx(Triplet T,int n)

{
    int i;
    for(i=n;i>=1;i--)
    {
        printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        printf("\n");
    }
}
void Print_shu(Triplet T,int n)
{
    int i;
    for(i=1;i<=n;i++)
    {
        printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        printf("\n");
    }
}
void Print(Triplet T)

{
    int i;
    for(i=1;i<=NUM;i++)
    {
        printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        printf("\n");
    }
}
void main()

{
    Triplet T=NULL;
    ElemType e;
    int select;
    int n;
    int num;
    int m;
    int x;
    int y;
    int a;
    do{

            printf("\n****************************\n");
            printf("****\t1:打印图书信息\t\t\t****\n");
            printf("****\t2:打印按价格降序后的图书信息\t\t\t****\n");
            printf("****\t3:打印价格按平均价格修改后的图书信息\t\t\t****\n");
            printf("****\t4:图书信息表的逆序存储\t\t\t****\n");
            printf("****\t5:查找最贵图书的信息\t\t\t****\n");
            printf("****\t6:图书信息表最爱图书的查找\t\t\t****\n");
            printf("****\t7:图书信息表按位置查找\t\t\t****\n");
            printf("****\t8:图书信息表的新图书入库\t\t\t****\n");

            printf("****\t9:图书信息表的旧图书出库\t\t\t****\n");
            printf("****\t10:图书信息表的图书去重\t\t\t****\n");
            printf("****\t0:结束\t\t\t****\n");
            printf("\n****************************\n");
            scanf("%d",&select);
            switch (select)

            {
            case 1:
                    printf("输入三个数,建立一个三元组:\n");
                    if(InitTriplet(&T)==OVERFLOW)
                    printf("分配失败,退出程序!");
                    printf("图书信息表为:\n");
                    printf("%d",NUM);
                    printf("\n");
                    Print(T);
                    break;
            case 2:
                printf("输入三个数,建立一个三元组:\n");
                if(InitTriplet(&T)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("按价格降序排列后的图书信息表为:\n");
                Descending(T);
                Print(T);
                break;
            case 3:

                printf("输入三个数,建立一个三元组:\n");
                if(InitTriplet(&T)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("价格按平均价格修改后的图书信息为:\n");
                Pricemodify(T);
                Print(T);
                break;
            case 4:
                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("倒序后的图书信息表为:\n");
                Inversion(T,n);
                Print_dx(T,n);
                break;
            case 5:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("最贵图书的数目和信息为:\n");
                SelectExpensive(T,n);
                break;
            case 6:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("请输入想要查找最喜爱图书的次数:\n");
                scanf("%d",&num);
                SelectFavorite(T,n,num);
                break;
            case 7:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("请输入想要查找几次:\n");
                scanf("%d",&m);
                SelectPoint(T,m);
                break;
            case 8:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("请输入新信息插入的位置:\n");
                scanf("%d",&x);
                if(x>n||x<1)
                    printf("抱歉,入库位置非法!\n");
                else
                printf("请输入新的图书信息:\n");
                scanf("%s%s%f",e.num[0],e.name[0],e.price);
                Insert(T,e,n,x);
                Print_shu(T,(n+1));
                break;
            case 9:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("请输入想要删除的图书的位置:\n");
                scanf("%d",&y);
                Delete(T,n,y);
                Print_shu(T,(n-1));
                break;
            case 10:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                a=DeleteRepeat(T,n);
                printf("去重之后的图书信息表为:\n");
                Print_shu(T,a);
                break;
            case 0:
                printf("操作结束!\n");
                break;
            default:
                printf("输入选择错误!\n");
            }

        }while(select!=0);
        DestroyTriplet(T);
}
#include<stdio.h>

#include<stdlib.h>

#include<string.h>
#include<time.h>
#define MAX 6
typedef struct node
{
    char num[15];
    char name[10];
    float price;
}ElemType;
typedef ElemType* Triplet;
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
static int NUM = 0;
void Print(Triplet);
Status InitTriplet(Triplet* T)

{
    int n = 1;
    char str1[15] = "0";
    char str2[15] = "0";
    (*T) = (ElemType*)malloc(MAX * sizeof(ElemType));
    srand((unsigned)time(NULL));
    if ((*T) == NULL)
        return OVERFLOW;
    printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
    scanf("%s%s%f", &(*T)[n].num[0], &(*T)[n].name[0], &(*T)[n].price);
    while (strcmp((*T)[n].num, str1) != 0 || strcmp((*T)[n].name, str2) != 0 || (*T)[n].price != 0) {

        n++;
        NUM++;
        printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
        scanf("%s%s%f", &(*T)[n].num[0], &(*T)[n].name[0], &(*T)[n].price);
    }
    return NUM;
}
Status CreatTriplet(Triplet* T, int n)

{
    int i;
    (*T) = (ElemType*)malloc(n * sizeof(ElemType));
    srand((unsigned)time(NULL));
    if ((*T) == NULL)
        return OVERFLOW;
    for (i = 1; i <= n; i++)
    {
        printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
        scanf("%s%s%f", &(*T)[i].num[0], &(*T)[i].name[0], &(*T)[i].price);
    }
    return OK;
}
Status DestroyTriplet(Triplet T)
{
    free(T);
    T = NULL;
    return OK;
}
void Descending(Triplet T)
{
    float jiage;
    int i, j;
    for (i = 1; i <= NUM - 1; i++)
        for (j = 1; j <= NUM - i; j++)
            if (T[j + 1].price > T[j].price)
            {
                jiage = T[j].price;
                T[j].price = T[j + 1].price;
                T[j + 1].price = jiage;
            }

}
void Pricemodify(Triplet T)

{
    int i;
    float sum, average;
    sum = 0;
    average = 0;
    for (i = 1; i <= NUM; i++)
    {
        sum += T[i].price;
    }
    average = sum / (NUM * 1.00);
    printf("%.2f", average);
    for (i = 1; i <= NUM; i++)
    {
        if (T[i].price < average)
            T[i].price += T[i].price * 0.2;
        else T[i].price += T[i].price * 0.1;
    }

}
void Inversion(Triplet T, int n)

{
    int i;
    char str1[15];
    char str2[10];
    float temp;
    for (i = 1; i <= (n / 2); i++)
    {
        strcpy(str1, T[i].num);
        strcpy(T[i].num, T[n - i].num);
        strcpy(T[n - i].num, str1);
        strcpy(str2, T[i].name);
        strcpy(T[i].name, T[n - i].name);
        strcpy(T[n - i].name, str2);
        temp = T[i].price;
        T[i].price = T[n - i].price;
        T[n - i].price = temp;
    }
}
void SelectExpensive(Triplet T, int n)

{
    int i;
    int count;
    float max;
    count = 0;
    max = T[1].price;
    for (i = 1; i <= n; i++)
    {
        if (max < T[n].price)
            max = T[n].price;
    }
    for (i = 1; i <= n; i++)
    {
        if (T[i].price == max)
            count++;
    }
    printf("%d\n", count);

    for (i = 1; i <= n; i++)
    {
        if (T[i].price == max)
            printf("%14s %9s %.2f", T[i].num, T[i].name, T[i].price);
        printf("\n");

    }
}
//void Input(int n)

//{
//    int i;
//    char str[10][15];
//    printf("请输入%d个最爱图书的名称:\n",n);
//    for(i=1;i<=n;i++)
 //  scanf("%14s",str[i][15]);
//}
void SelectFavorite(Triplet T, int num, int m)

{
    int count;
    int i, j;
    char str[MAX][15];
    count = 0;
    printf("请输入最爱图书的名称:\n");
    for (i = 1; i <= m; i++)
        scanf("%s", str[i]);

    for (i = 1; i <= m; i++)
    {
        for (j = 1; j <= num; j++)
        {
            if (strcmp(str[i], T[j].name) == 0)
            {
                printf("%14s %9s %.2f", T[j].num, T[j].name, T[j].price);
                count++;
                printf("\n");
            }
        }
    }
    printf("%d\n", count);

    if (count == 0)
        printf("抱歉,没有你的最爱\n");
}
void SelectPoint(Triplet T, int n)

{
    int i;
    int point[MAX];
    printf("请输入想要查找的图书的位置:\n");
    for (i = 1; i <= n; i++)
        scanf("%d", &point[i]);
    for (i = 1; i <= n; i++)
    {
        if (point[i] == 0)
            printf("抱歉,最佳位置上的图书不存在!\n");
        else
        {
            printf("%14s%9s%.2f", T[point[i]].num, T[point[i]].name, T[point[i]].price);
            printf("\n");
        }
    }

}
void Insert(Triplet T, ElemType e, int num, int n)

{
    int i;
    //    for(i=1;i<n;i++)
    //    {
    //    printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
    //    printf("\n");
    //    }
    //    printf("%14s %9s %.2f",T[n].num,T[n].name,T[n].price);
    //    printf("\n");
    for (i = num + 1; i > n; i--)
    {
        T[i] = T[i - 1];

        // printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
         //printf("\n");
    }
    T[n] = e;
}
void Delete(Triplet T, int n, int num)

{
    int i;
    for (i = num; i < n; i++)
        T[num] = T[num + 1];
}
int DeleteRepeat(Triplet T, int n)
{
    int i, j, k;
    for (i = 1; i <= n; i++)
    {
        for (j = i + 1; j <= n; j++)
        {
            if (strcmp(T[j].num, T[i].num) == 0)
            {
                for (k = j + 1; k <= n; k++)
                    T[k - 1] = T[k];
                n--;
            }
        }
    }
    return n;
}
void Print_dx(Triplet T, int n)

{
    int i;
    for (i = n; i >= 1; i--)
    {
        printf("%14s %9s %.2f", T[i].num, T[i].name, T[i].price);
        printf("\n");
    }
}
void Print_shu(Triplet T, int n)
{
    int i;
    for (i = 1; i <= n; i++)
    {
        printf("%14s %9s %.2f", T[i].num, T[i].name, T[i].price);
        printf("\n");
    }
}
void Print(Triplet T)

{
    int i;
    for (i = 1; i <= NUM; i++)
    {
        printf("%14s %9s %.2f", T[i].num, T[i].name, T[i].price);
        printf("\n");
    }
}
void main()

{
    Triplet T = NULL;
    ElemType e;
    int select;
    int n;
    int num;
    int m;
    int x;
    int y;
    int a;
    do {

        printf("\n****************************\n");
        printf("****\t1:打印图书信息\t\t\t****\n");
        printf("****\t2:打印按价格降序后的图书信息\t\t\t****\n");
        printf("****\t3:打印价格按平均价格修改后的图书信息\t\t\t****\n");
        printf("****\t4:图书信息表的逆序存储\t\t\t****\n");
        printf("****\t5:查找最贵图书的信息\t\t\t****\n");
        printf("****\t6:图书信息表最爱图书的查找\t\t\t****\n");
        printf("****\t7:图书信息表按位置查找\t\t\t****\n");
        printf("****\t8:图书信息表的新图书入库\t\t\t****\n");

        printf("****\t9:图书信息表的旧图书出库\t\t\t****\n");
        printf("****\t10:图书信息表的图书去重\t\t\t****\n");
        printf("****\t0:结束\t\t\t****\n");
        printf("\n****************************\n");
        scanf("%d", &select);
        switch (select)

        {
        case 1:
            printf("输入三个数,建立一个三元组:\n");
            if (InitTriplet(&T) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("图书信息表为:\n");
            printf("%d", NUM);
            printf("\n");
            Print(T);
            break;
        case 2:
            printf("输入三个数,建立一个三元组:\n");
            if (InitTriplet(&T) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("按价格降序排列后的图书信息表为:\n");
            Descending(T);
            Print(T);
            break;
        case 3:

            printf("输入三个数,建立一个三元组:\n");
            if (InitTriplet(&T) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("价格按平均价格修改后的图书信息为:\n");
            Pricemodify(T);
            Print(T);
            break;
        case 4:
            printf("请输入图书信息的个数:\n");
            scanf("%d", &n);
            if (CreatTriplet(&T, n) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("倒序后的图书信息表为:\n");
            Inversion(T, n);
            Print_dx(T, n);
            break;
        case 5:

            printf("请输入图书信息的个数:\n");
            scanf("%d", &n);
            if (CreatTriplet(&T, n) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("最贵图书的数目和信息为:\n");
            SelectExpensive(T, n);
            break;
        case 6:

            printf("请输入图书信息的个数:\n");
            scanf("%d", &n);
            if (CreatTriplet(&T, n) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("请输入想要查找最喜爱图书的次数:\n");
            scanf("%d", &num);
            SelectFavorite(T, n, num);
            break;
        case 7:

            printf("请输入图书信息的个数:\n");
            scanf("%d", &n);
            if (CreatTriplet(&T, n) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("请输入想要查找几次:\n");
            scanf("%d", &m);
            SelectPoint(T, m);
            break;
        case 8:

            printf("请输入图书信息的个数:\n");
            scanf("%d", &n);
            if (CreatTriplet(&T, n) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("请输入新信息插入的位置:\n");
            scanf("%d", &x);
            if (x > n || x < 1)
                printf("抱歉,入库位置非法!\n");
            else
                printf("请输入新的图书信息:\n");
            scanf("%s%s%f", e.num, e.name, &e.price);
            Insert(T, e, n, x);
            Print_shu(T, (n + 1));
            break;
        case 9:

            printf("请输入图书信息的个数:\n");
            scanf("%d", &n);
            if (CreatTriplet(&T, n) == OVERFLOW)
                printf("分配失败,退出程序!");
            printf("请输入想要删除的图书的位置:\n");
            scanf("%d", &y);
            Delete(T, n, y);
            Print_shu(T, (n - 1));
            break;
        case 10:

            printf("请输入图书信息的个数:\n");
            scanf("%d", &n);
            if (CreatTriplet(&T, n) == OVERFLOW)
                printf("分配失败,退出程序!");
            a = DeleteRepeat(T, n);
            printf("去重之后的图书信息表为:\n");
            Print_shu(T, a);
            break;
        case 0:
            printf("操作结束!\n");
            break;
        default:
            printf("输入选择错误!\n");
        }

    } while (select != 0);
    DestroyTriplet(T);
}