在输入第二个信息之后程序就显示访问位置冲突
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#include<string.h>
struct Medicine {
char ID[20];
char Name[10];
float Price[20];
} medicines[80];
int num = 0;
void Copy(struct Medicine* arr, int i, int j)
{
strcpy(arr[i].ID, arr[j].ID);
strcpy(arr[i].Name, arr[j].Name);
strcpy(arr[i].Price, arr[j].Price);
}
int Medicine_SearchByName(char name[])
{
int i;
for (i = 0; i < num; i++)
{
if (strcmp(medicines[i].Name, name) == 0)
{
return i;
}
}
return -1;
}
int Medicine_SearchByIndex(char id)
{
int i;
for (i = 0; i < num; i++)
{
if (strcmp(medicines[i].ID, id) == 0)
{
return i;
}
}
return -1;
}
void Medicine_DisplaySingle(int index)
{
printf("%10s%10s%10s\n", "序号","名称","价格");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%8.2f%8.2f%8.2f%8.2f%10.2f%10.2f\n", medicines[index].ID, medicines[index].Name, medicines[index].Price);
}
void inputt()
{
while (1)
{
printf("请输入序号:");
scanf("%s", medicines[num].ID);
getchar();
printf("请输入名称:");
scanf("%s", medicines[num].Name);
getchar();
printf("请输入价格:");
scanf("%f", medicines[num].Price);
getchar();
if (Medicine_SearchByIndex(medicines[num].ID) == -1)
{
num++;
}
else
{
printf("输入数据无效 !!!\n");
}
printf("是否继续?(y/n)");
if (getchar() == 'n')
{
break;
}
}
}
void modify()
{
while (1)
{
char id[20];
int index;
printf("请输入要修改的序号:");
scanf("%s", &id);
getchar();
index = Medicine_SearchByIndex(id);
if (index == -1)
{
printf("药品不存在!\n");
}
else
{
printf("你要修改的药品信息为:\n");
Medicine_DisplaySingle(index);
printf("请输入新值\n");
printf("请输入序号;");
scanf("%s", medicines[index].ID);
getchar();
printf("请输入名称;");
scanf("%s", medicines[index].Name);
getchar();
printf("请输入价格:");
scanf("%f", medicines[index].Price);
getchar();
}
printf("是否继续?(y/n)");
if (getchar() == 'n')
{
break;
}
}
}
void deletee()
{
int i;
while (1)
{
char id[20];
int index;
printf("请输入要删除的序号:");
scanf("%s", &id);
getchar();
index = Medicine_SearchByIndex(id);
if (index == -1)
{
printf("药品不存在!\n");
}
else
{
printf("你要删除的药品信息为:\n");
Medicine_DisplaySingle(index);
printf("是否真的要删除?(y/n)");
if (getchar() == 'y')
{
for (i = index; i < num - 1; i++)
{
Copy(medicines, i, i + 1);
medicines[i] = medicines[i + 1];
}
num--;
}
getchar();
}
printf("是否继续?(y/n)");
if (getchar() == 'n')
{
break;
}
}
}
void display()
{
int a;
printf("%10s%10s%10s\n", "序号", "名称", "价格");
printf("-------------------------------------------------------------\n");
for (a = 0; a < num; a++)
{
printf("%10s%10s%10.2f\n", medicines[a].ID, medicines[a].Name,
medicines[a].Price);
}
}
void insert()
{
int a, b, c;
printf("请输入你要插入的位置");
scanf("%d", &a);
if (a > num) {
printf("输入的位置有误,请重新输入,当前共%d条数据\n", num);
scanf("%d", &a);
}
for (b = num - 1; b >= a - 1; b--)
{
//strcpy(medicines[b+1].ID,medicines[b].ID);
//strcpy(meicines[b+1].Name,medicines[b].Name);
//medicines[b+1].Price=medicines[b].Price;
Copy(medicines, b + 1, b);
}
num++;
printf("请输入序号:");
scanf("%s", medicines[a - 1].ID);
getchar();
printf("请输入名称:");
scanf("%s", medicines[a - 1].Name);
getchar();
printf("请输入价格:");
scanf("%f", medicines[a - 1].Price);
getchar();
}
void search()
{
while (1)
{
char name[20];
int index;
printf("请输入要查询的名称:");
scanf("%s", &name);
getchar();
index = Medicine_SearchByName(name);
if (index == -1)
{
printf("不存在!\n");
}
else
{
printf("你要查询的药品信息为:\n");
Medicine_DisplaySingle(index);
}
printf("是否继续?(y/n)");
if (getchar() == 'n')
{
break;
}
}
}
void Save()
{
FILE* fp = fopen("temp.txt", "w+");
fprintf(fp, "%d\n", num);
for (int i = 0; i < num; i++)
{
fprintf(fp, "%s %s %f\n", medicines[i].ID,medicines[i].Name, medicines[i].Price);
}
fclose(fp);
}
void Load()
{
FILE* fp = fopen("temp.txt", "r");
fscanf(fp, "%d", &num);
for (int i = 0; i < num; i++)
{
fscanf(fp, "%s %s %f\n", medicines[i].ID, medicines[i].Name, medicines[i].Price);
}
fclose(fp);
}
/*主程序*/
int main() {
int i;
while (1) {
Load();
printf("\t\t\t\t\t-------- 药品信息管理系统-------\n\n\n\n");
printf("\t\t\t\t\t1. 增加药品信息\n\n");
printf("\t\t\t\t\t2. 修改药品信息\n\n");
printf("\t\t\t\t\t3. 删除药品信息\n\n");
printf("\t\t\t\t\t4. 插入药品信息\n\n");
printf("\t\t\t\t\t5. 显示所有药品信息\n\n");
printf("\t\t\t\t\t6. 查询药品信息\n\n");
printf("\t\t\t\t\t0. 退出\n\n\n");
printf("请选择(0-6):");
scanf("%d", &i);
switch (i) {
case 1:inputt(); break;
case 2:modify(); break;
case 3:deletee(); break;
case 4:insert(); break;
case 5:display(); break;
case 6:search(); break;
case 0:exit(0);
default:;
}
Save();
}
return 0;
}
代码修改完善如下,改动处见注释,供参考:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#include<string.h>
struct Medicine {
char ID[20];
char Name[10];
float Price; //float Price[20]; // 修改
} medicines[80];
int num = 0;
void Copy(struct Medicine* arr, int i, int j) // 修改 这个函数多余无用,可以删除
{
strcpy(arr[i].ID, arr[j].ID);
strcpy(arr[i].Name, arr[j].Name);
arr[i].Price = arr[j].Price; // 修改
//strcpy(arr[i].Price, arr[j].Price); 修改
}
int Medicine_SearchByName(char name[])
{
int i;
for (i = 0; i < num; i++)
{
if (strcmp(medicines[i].Name, name) == 0)
{
return i;
}
}
return -1;
}
int Medicine_SearchByIndex(char* id)
//int Medicine_SearchByIndex(char id) 修改
{
int i;
for (i = 0; i < num; i++)
{
if (strcmp(medicines[i].ID, id) == 0)
{
return i;
}
}
return -1;
}
void Medicine_DisplaySingle(int index)
{
printf("%10s%10s%10s\n", "序号","名称","价格");
printf("-------------------------------------------------------------\n");
// printf("%10s%10s%8.2f%8.2f%8.2f%8.2f%10.2f%10.2f\n", medicines[index].ID, // 修改
printf("%10s%10s%8.2f\n", medicines[index].ID, // 修改
medicines[index].Name, medicines[index].Price);
}
void inputt()
{
while (1)
{
printf("请输入序号:");
scanf("%s", medicines[num].ID);
getchar();
printf("请输入名称:");
scanf("%s", medicines[num].Name);
getchar();
printf("请输入价格:");
scanf("%f", &medicines[num].Price); // 修改
//scanf("%f", medicines[num].Price);
getchar();
if (Medicine_SearchByIndex(medicines[num].ID) == -1)
{
num++;
}
else
{
printf("输入数据无效 !!!\n");
}
printf("是否继续?(y/n)");
if (getchar() == 'n')
{
break;
}
}
}
void modify()
{
while (1)
{
char id[20];
int index;
printf("请输入要修改的序号:");
scanf("%s", &id);
getchar();
index = Medicine_SearchByIndex(id);
if (index == -1)
{
printf("药品不存在!\n");
}
else
{
printf("你要修改的药品信息为:\n");
Medicine_DisplaySingle(index);
printf("请输入新值\n");
printf("请输入序号;");
scanf("%s", medicines[index].ID);
getchar();
printf("请输入名称;");
scanf("%s", medicines[index].Name);
getchar();
printf("请输入价格:");
scanf("%f", &medicines[index].Price); // 修改
//scanf("%f", medicines[index].Price);
getchar();
}
printf("是否继续?(y/n)");
if (getchar() == 'n')
{
break;
}
}
}
void deletee()
{
int i;
while (1)
{
char id[20];
int index;
printf("请输入要删除的序号:");
scanf("%s", &id);
getchar();
index = Medicine_SearchByIndex(id);
if (index == -1)
{
printf("药品不存在!\n");
}
else
{
printf("你要删除的药品信息为:\n");
Medicine_DisplaySingle(index);
printf("是否真的要删除?(y/n)");
if (getchar() == 'y')
{
for (i = index; i < num - 1; i++)
{
// Copy(medicines, i, i + 1); 修改,这句删除,无用
medicines[i] = medicines[i + 1];
}
num--;
}
getchar();
}
printf("是否继续?(y/n)");
if (getchar() == 'n')
{
break;
}
}
}
void display()
{
int a;
printf("%10s%10s%10s\n", "序号", "名称", "价格");
printf("-------------------------------------------------------------\n");
for (a = 0; a < num; a++)
{
printf("%10s%10s%10.2f\n", medicines[a].ID, medicines[a].Name,
medicines[a].Price);
}
}
void insert()
{
int a, b, c;
do { // 修改
printf("输入你要插入的位置"); // 修改
scanf("%d", &a);
if (a > num || a < 1) // 修改
printf("输入的位置有误,当前共%d条数据,请重新", num);
}while (a < 1 || a > num); // 修改
for (b = num - 1; b >= a - 1; b--)
{
medicines[b + 1] = medicines[b]; // 修改
//strcpy(medicines[b+1].ID,medicines[b].ID);
//strcpy(meicines[b+1].Name,medicines[b].Name);
//medicines[b+1].Price=medicines[b].Price;
//Copy(medicines, b + 1, b);
}
num++;
printf("请输入序号:");
scanf("%s", medicines[a - 1].ID);
getchar();
printf("请输入名称:");
scanf("%s", medicines[a - 1].Name);
getchar();
printf("请输入价格:");
scanf("%f", &medicines[a - 1].Price); // 修改
//scanf("%f", medicines[a - 1].Price);
getchar();
}
void search()
{
while (1)
{
char name[20];
int index;
printf("请输入要查询的名称:");
scanf("%s", &name);
getchar();
index = Medicine_SearchByName(name);
if (index == -1)
{
printf("不存在!\n");
}
else
{
printf("你要查询的药品信息为:\n");
Medicine_DisplaySingle(index);
}
printf("是否继续?(y/n)");
if (getchar() == 'n')
{
break;
}
}
}
void Save()
{
FILE* fp = fopen("temp.txt", "w+");
fprintf(fp, "%d\n", num);
for (int i = 0; i < num; i++)
{
fprintf(fp, "%s %s %f\n", medicines[i].ID,medicines[i].Name, medicines[i].Price);
}
fclose(fp);
}
void Load()
{
FILE* fp = fopen("temp.txt", "r");
if (!fp) { // 修改
printf("File open fail!\n"); // 修改
return; // 修改
}
fscanf(fp, "%d", &num);
for (int i = 0; i < num; i++)
{
fscanf(fp, "%s %s %f\n", medicines[i].ID, medicines[i].Name, &medicines[i].Price); // 修改
//fscanf(fp, "%s %s %f\n", medicines[i].ID, medicines[i].Name, medicines[i].Price);
}
fclose(fp);
}
/*主程序*/
int main() {
int i;
Load(); // 修改
while (1) {
//Load(); 修改
printf("\t\t\t\t\t-------- 药品信息管理系统-------\n\n\n\n");
printf("\t\t\t\t\t1. 增加药品信息\n\n");
printf("\t\t\t\t\t2. 修改药品信息\n\n");
printf("\t\t\t\t\t3. 删除药品信息\n\n");
printf("\t\t\t\t\t4. 插入药品信息\n\n");
printf("\t\t\t\t\t5. 显示所有药品信息\n\n");
printf("\t\t\t\t\t6. 查询药品信息\n\n");
printf("\t\t\t\t\t0. 退出\n\n\n");
printf("请选择(0-6):");
scanf("%d", &i);
switch (i) {
case 1:inputt(); break;
case 2:modify(); break;
case 3:deletee(); break;
case 4:insert(); break;
case 5:display(); break;
case 6:search(); break;
case 0:Save(); exit(0);// 修改
default:;
}
//Save(); 修改
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:注意:此图队列中(黑色框中)红色元素为将要Pop的元素,然后右边是其左右孩子节点的进入,为空则不进入。
如上,这就实现了层次遍历