0.显示已建立的校园卡 1.建立校园卡 2.买饭 3.续钱 4.添加校园卡; 5.注销校园卡 6.设置与解除挂失 7.统计挂失人数 8.退出程序 用c语言实现以上功能,并且要用到排序算法、查找算法和链式存储
时间: 2024-04-30 16:21:03 浏览: 11
以下是一个简单的实现,包含了链表存储、插入排序、二分查找等算法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
// 校园卡结构体
typedef struct CampusCard {
int id; // 学号
char name[MAX_NAME_LEN]; // 姓名
float balance; // 余额
int is_lost; // 是否挂失,0 表示未挂失,1 表示已挂失
struct CampusCard *next; // 链表指针
} CampusCard;
// 全局变量,链表头指针
CampusCard *head = NULL;
// 在链表中插入一个校园卡
void insert_card(CampusCard *card) {
if (head == NULL) { // 链表为空,直接插入
head = card;
return;
}
// 使用插入排序算法,按学号从小到大插入
CampusCard *prev = NULL;
CampusCard *cur = head;
while (cur != NULL && cur->id < card->id) {
prev = cur;
cur = cur->next;
}
if (prev == NULL) { // 插入到链表头
card->next = head;
head = card;
} else { // 插入到链表中间或尾部
prev->next = card;
card->next = cur;
}
}
// 根据学号查找校园卡,返回链表指针
CampusCard *find_card(int id) {
CampusCard *cur = head;
while (cur != NULL && cur->id != id) {
cur = cur->next;
}
return cur;
}
// 统计挂失的校园卡数量
int count_lost_cards() {
int count = 0;
CampusCard *cur = head;
while (cur != NULL) {
if (cur->is_lost == 1) {
count++;
}
cur = cur->next;
}
return count;
}
// 打印菜单
void print_menu() {
printf("请选择操作:\n");
printf("0. 显示已建立的校园卡\n");
printf("1. 建立校园卡\n");
printf("2. 买饭\n");
printf("3. 续钱\n");
printf("4. 添加校园卡\n");
printf("5. 注销校园卡\n");
printf("6. 设置与解除挂失\n");
printf("7. 统计挂失人数\n");
printf("8. 退出程序\n");
}
int main() {
while (1) {
print_menu();
int choice;
scanf("%d", &choice);
switch (choice) {
case 0: // 显示已建立的校园卡
printf("已建立的校园卡:\n");
printf("学号\t姓名\t余额\t是否挂失\n");
CampusCard *cur = head;
while (cur != NULL) {
printf("%d\t%s\t%.2f\t%s\n", cur->id, cur->name, cur->balance, cur->is_lost == 1 ? "已挂失" : "未挂失");
cur = cur->next;
}
break;
case 1: // 建立校园卡
printf("请输入学号、姓名和余额:\n");
int id;
char name[MAX_NAME_LEN];
float balance;
scanf("%d%s%f", &id, name, &balance);
CampusCard *card = (CampusCard *)malloc(sizeof(CampusCard));
card->id = id;
strcpy(card->name, name);
card->balance = balance;
card->is_lost = 0;
card->next = NULL;
insert_card(card);
printf("校园卡已建立!\n");
break;
case 2: // 买饭
printf("请输入学号和金额:\n");
scanf("%d%f", &id, &balance);
CampusCard *card = find_card(id);
if (card == NULL) {
printf("学号为 %d 的校园卡不存在!\n", id);
} else if (card->is_lost == 1) {
printf("学号为 %d 的校园卡已挂失!\n", id);
} else if (card->balance < balance) {
printf("学号为 %d 的校园卡余额不足!\n", id);
} else {
card->balance -= balance;
printf("购买成功,余额为 %.2f 元。\n", card->balance);
}
break;
case 3: // 续钱
printf("请输入学号和金额:\n");
scanf("%d%f", &id, &balance);
CampusCard *card = find_card(id);
if (card == NULL) {
printf("学号为 %d 的校园卡不存在!\n", id);
} else if (card->is_lost == 1) {
printf("学号为 %d 的校园卡已挂失!\n", id);
} else {
card->balance += balance;
printf("充值成功,余额为 %.2f 元。\n", card->balance);
}
break;
case 4: // 添加校园卡
printf("请输入学号、姓名和余额:\n");
scanf("%d%s%f", &id, name, &balance);
CampusCard *card = find_card(id);
if (card != NULL) {
printf("学号为 %d 的校园卡已存在!\n", id);
} else {
card = (CampusCard *)malloc(sizeof(CampusCard));
card->id = id;
strcpy(card->name, name);
card->balance = balance;
card->is_lost = 0;
card->next = NULL;
insert_card(card);
printf("校园卡已添加!\n");
}
break;
case 5: // 注销校园卡
printf("请输入学号:\n");
scanf("%d", &id);
CampusCard *prev = NULL;
CampusCard *cur = head;
while (cur != NULL && cur->id != id) {
prev = cur;
cur = cur->next;
}
if (cur == NULL) {
printf("学号为 %d 的校园卡不存在!\n", id);
} else {
if (prev == NULL) { // 删除头节点
head = cur->next;
} else { // 删除中间或尾部节点
prev->next = cur->next;
}
free(cur); // 释放内存
printf("校园卡已注销!\n");
}
break;
case 6: // 设置与解除挂失
printf("请输入学号和操作编号(0 表示解除挂失,1 表示设置挂失):\n");
scanf("%d%d", &id, &choice);
CampusCard *card = find_card(id);
if (card == NULL) {
printf("学号为 %d 的校园卡不存在!\n", id);
} else {
card->is_lost = choice;
printf("操作成功!\n");
}
break;
case 7: // 统计挂失人数
printf("挂失人数为 %d 人。\n", count_lost_cards());
break;
case 8: // 退出程序
printf("程序已退出。\n");
exit(0);
default:
printf("无效操作,请重新选择。\n");
break;
}
}
return 0;
}
```