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