仓储管理系统
【基本功能】
把货品信息表抽象成一个线性表,货品信息(包括ID、货品名、定价、数量等)作为线性表的一个元素,实现:按ID、货品名分别查找某货品信息(包括ID、货品名、定价、数量等);收录货品(如果货品在帐中已有,则只将总库存量增加。否则插入新增信息);售出货品(如果帐中还有存货,则只将总库存量减少。如果库存为0,则提示售出失败);清除货品(删除该货品信息)、修改货品(ID、货品名和单价);排序(按定价排序--采用冒泡排序、按数量排序--采用快排)等功能。
【基本要求】
(1)分别采用单链表和顺序表实现相应功能。
(2)编写一个测试主函数,测试所实现的功能。
#include
#include
#include
// 货品信息结构体
typedef struct {
int id; // 货品ID
char name[50]; // 货品名称
float price; // 货品价格
int quantity; // 货品数量
} Product;
// 线性表结构体
typedef struct {
Product *data; // 指向存储货品信息的数组的指针
int length; // 当前存储的货品信息数量
int capacity; // 数组的容量
} List;
// 初始化线性表
void initList(List *list) {
list->data = (Product *)malloc(sizeof(Product) * 10); // 初始分配存储空间
list->length = 0; // 初始长度为0
list->capacity = 10; // 初始容量为10
}
// 扩容线性表
void expandList(List *list) {
list->data = (Product *)realloc(list->data, sizeof(Product) * (list->capacity + 10)); // 重新分配更大的存储空间
list->capacity += 10; // 更新容量
}
// 插入货品信息
void insertProduct(List *list, Product product) {
int i;
// 判断货品是否已存在
for (i = 0; i < list->length; i++) {
if (list->data[i].id == product.id) {
// 货品已存在,增加库存量
list->data[i].quantity += product.quantity;
return;
}
}
// 货品不存在,插入新增信息
if (list->length >= list->capacity) {
expandList(list); // 如果存储空间不足,扩容
}
list->data[list->length++] = product; // 插入新的货品信息
}
// 删除货品信息
void deleteProduct(List *list, int id) {
int i;
for (i = 0; i < list->length; i++) {
if (list->data[i].id == id) {
// 将最后一个元素覆盖要删除的元素
list->data[i] = list->data[list->length - 1];
list->length--; // 更新长度
return;
}
}
printf("货品不存在\n");
}
// 修改货品信息
void modifyProduct(List *list, int id, char name[], float price) {
int i;
for (i = 0; i < list->length; i++) {
if (list->data[i].id == id) {
strcpy(list->data[i].name, name); // 修改名称
list->data[i].price = price; // 修改价格
return;
}
}
printf("货品不存在\n");
}
// 按ID查找货品信息
void searchById(List *list, int id) {
int i;
for (i = 0; i < list->length; i++) {
if (list->data[i].id == id) {
printf("ID: %d, 货品名: %s, 定价: %.2f, 数量: %d\n", list->data[i].id, list->data[i].name, list->data[i].price,
list->data[i].quantity);
return;
}
}
printf("货品不存在\n");
}
// 按货品名查找货品信息
void searchByName(List *list, char name[]) {
int i;
for (i = 0; i < list->length; i++) {
if (strcmp(list->data[i].name, name) == 0) {
printf("ID: %d, 货品名: %s, 定价: %.2f, 数量: %d\n", list->data[i].id, list->data[i].name, list->data[i].price,
list->data[i].quantity);
return;
}
}
printf("货品不存在\n");
}
// 售出货品
void sellProduct(List *list, int id) {
int i;
for (i = 0; i < list->length; i++) {
if (list->data[i].id == id) {
if (list->data[i].quantity > 0) {
list->data[i].quantity--;
printf("售出成功\n");
} else {
printf("售出失败,库存为0\n");
}
return;
}
}
printf("货品不存在\n");
}
// 按定价排序(冒泡排序)
void sortByPrice(List *list) {
int i, j;
for (i = 0; i < list->length - 1; i++) {
for (j = 0; j < list->length - i - 1; j++) {
if (list->data[j].price > list->data[j + 1].price) {
// 交换元素
Product temp = list->data[j];
list->data[j] = list->data[j + 1];
list->data[j + 1] = temp;
}
}
}
}
// 按数量排序(快速排序)
void quickSortByQuantity(Product *data, int left, int right) {
if (left >= right) {
return;
}
int i = left;
int j = right;
Product pivot = data[left];
while (i < j) {
while (i < j && data[j].quantity >= pivot.quantity) {
j--;
}
data[i] = data[j];
while (i < j && data[i].quantity <= pivot.quantity) {
i++;
}
data[j] = data[i];
}
data[i] = pivot;
quickSortByQuantity(data, left, i - 1);
quickSortByQuantity(data, i + 1, right);
}
// 显示货品信息
void showProducts(List *list) {
int i;
for (i = 0; i < list->length; i++) {
printf("ID: %d, 货品名: %s, 定价: %.2f, 数量: %d\n", list->data[i].id, list->data[i].name, list->data[i].price,
list->data[i].quantity);
}
}
int main() {
List list;
initList(&list);
// 菜单循环
while (1) {
printf("\n===============\n");
printf("1. 收录货品\n");
printf("2. 删除货品\n");
printf("3. 修改货品\n");
printf("4. 按ID查找货品\n");
printf("5. 按货品名查找货品\n");
printf("6. 售出货品\n");
printf("7. 按定价排序\n");
printf("8. 按数量排序\n");
printf("9. 显示货品信息\n");
printf("0. 退出\n");
printf("===============\n");
printf("请选择操作:");
int choice;
scanf("%d", &choice);
getchar(); // 处理输入缓冲区的换行符
if (choice == 1) {
Product product;
printf("请输入货品ID:");
scanf("%d", &product.id);
getchar();
printf("请输入货品名:");
fgets(product.name, 50, stdin);
product.name[strlen(product.name) - 1] = '\0'; // 去掉末尾的换行符
printf("请输入货品定价:");
scanf("%f", &product.price);
printf("请输入货品数量:");
scanf("%d", &product.quantity);
insertProduct(&list, product);
printf("收录成功\n");
} else if (choice == 2) {
int id;
printf("请输入要删除的货品ID:");
scanf("%d", &id);
deleteProduct(&list, id);
} else if (choice == 3) {
int id;
printf("请输入要修改的货品ID:");
scanf("%d", &id);
getchar();
char name[50];
printf("请输入新的货品名:");
fgets(name, 50, stdin);
name[strlen(name) - 1] = '\0'; // 去掉末尾的换行符
float price;
printf("请输入新的货品定价:");
scanf("%f", &price);
modifyProduct(&list, id, name, price);
} else if (choice == 4) {
int id;
printf("请输入要查找的货品ID:");
scanf("%d", &id);
searchById(&list, id);
} else if (choice == 5) {
char name[50];
printf("请输入要查找的货品名:");
getchar();
fgets(name, 50, stdin);
name[strlen(name) - 1] = '\0'; // 去掉末尾的换行符
searchByName(&list, name);
} else if (choice == 6) {
int id;
printf("请输入要售出的货品ID:");
scanf("%d", &id);
sellProduct(&list, id);
} else if (choice == 7) {
sortByPrice(&list);
printf("按定价排序完成\n");
} else if (choice == 8) {
quickSortByQuantity(list.data, 0, list.length - 1);
printf("按数量排序完成\n");
} else if (choice == 9) {
showProducts(&list);
} else if (choice == 0) {
break;
} else {
printf("无效的选择\n");
}
}
free(list.data); // 释放内存
return 0;
}