在执行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);
}