C语言综合实验(四)之计费管理系统的链表基本操作

实验内容

(1)定义链表

(2)插入操作

将值为x的新结点插入到链表中。先检查插入位置的合法性,然后找到待插入位置的前驱结点,再在其后插入新结点。

(3)查找操作

在链表中查找值为x的结点,首先要判断链表是否为空,不为空时利用指针p顺指针向后查找,直到查找到值为x的结点,则查找成功;如果走到链尾p为NULL,则查找失败。

(4)删除操作

要删除链表中的一个结点,先查找待删除结点q的位置,令p指向待删除结点的前驱,令p指向q的后驱,释放q结点所占用的存储空间。

沿用第一次的main.cpp
不用第三次的card_file.h,card_file.cpp,tool.h,tool.cpp

menu.h
菜单头文件

void outputmenu();
void add();
void query();
void del();

menu.cpp
菜单源文件

#define _CRT_SECURE_NO_WARNINGS//消除scanf警告
#include"stdio.h"
#include"stdlib.h"
#include "string.h"
#include"menu.h"
#include"card.h"
//#include"card_file.h"
#include"time.h"
Card *card = initial();
void outputmenu() {
	do {
		char i;
		printf("以下为本账户管理系统的菜单界面\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");
		printf("0.退出\n");
		printf("请输入0-8数字来进行选择\n");
		scanf("%c", &i);
		switch (i) {
		case '0': {
			exit(0);
			break;
		}
		case '1': {
			add();
			break;
		}
		case '2': {
			query();
			break;
		}
		case '3': {
			system("cls");
			printf("以下为上机的菜单界面\n");
			system("pause");
			/*
			上机
			*/
			break;
		}
		case '4': {
			system("cls");
			printf("以下为下机的菜单界面\n");
			system("pause");
			/*
			下机
			*/
			break;
		}
		case '5': {
			system("cls");
			printf("以下为充值的菜单界面\n");
			system("pause");
			/*
			充值
			*/
			break;
		}
		case '6': {
			system("cls");
			printf("以下为退费的菜单界面\n");
			system("pause");
			/*
			退费
			*/
			break;
		}
		case '7': {
			system("cls");
			printf("以下为查询统计的菜单界面\n");
			//showCard();
			break;
		}
		case '8': {
			del();
			break;
		}
		default: {
			system("cls");
			printf("请输入正确的1-8数字\n");
			break;
		}
		}
	} while (1);
}
void add() {
	system("cls");
	//card=readCard();
	printf("以下为添加卡的菜单界面\n");
	printf("请输入需要添加的卡号(长度1-18):\n");
	char no[50];
	scanf("%s", no);
	while (strlen(no) > 18||queryCard(card,no)!=NULL) {
		if(strlen(no)>18) printf("卡号超过18位,请重新输入卡号(长度1-18):\n");
		else printf("该卡号已存在请重新输入卡号(长度1-18):\n");
		scanf("%s", no);
	}
	char pwd[30];
	printf("请输入密码(长度1-8):\n");
	scanf("%s", pwd);
	while (strlen(pwd) > 8) {
		printf("密码超过8位,请重新输入密码(长度1-8):\n");
		scanf("%s", pwd);
	}
	float balance;
	printf("请输入开卡金额(人民币):\n");
	scanf("%f", &balance);
	printf("添加卡的信息如下:\n");
	printf("卡号\t密码\t状态\t金额\n");
	printf("%s\t%s\t0\t%.1f\n", no, pwd, balance);
	addCard(card,no, pwd, balance);
	int i;
	printf("1.继续添加\n");
	printf("2.返回上级菜单\n");
	printf("0.退出\n");
	scanf("%d", &i);
	switch (i) {
	case 0: {
		exit(0); break;
	}
	case 1: {
		add(); break;
	}
	case 2: {
		break;
	}
	}
}
void query() {
	system("cls");
	//card=readCard();
	printf("以下为查询卡的菜单界面\n");
	printf("请输入需要查询的卡号(长度1-18):\n");
	char no[50];
	scanf("%s", no);
	while (strlen(no) > 18 || queryCard(card,no) == NULL) {
		if (strlen(no) > 18) printf("卡号超过18位,请重新输入卡号(长度1-18):\n");
		else printf("该卡号不存在请重新输入卡号(长度1-18):\n");
		scanf("%s", no);
	}
	Card *t = queryCard(card,no);
	printf("查询卡的信息如下:\n");
	printf("卡号\t状态\t余额\t累计使用\t使用次数\t上次使用时间\n");
	struct tm *p = localtime(&t->tLast);
	printf("%s\t%d\t%.1f\t%.1f\t\t%d\t", t->aName, t->nStatus,t->fBalance,t->fTotalUse,t->nUseCount);
	printf("%4d-", p->tm_year + 1900);
	printf("%02d-", p->tm_mon + 1);
	printf("%02d ", p->tm_mday);  
	printf("%02d:%02d:%02d\n", p->tm_hour, p->tm_min, p->tm_sec);
	int i;
	printf("1.继续查询\n");
	printf("2.返回上级菜单\n");
	printf("0.退出\n");
	scanf("%d", &i);
	switch (i) {
	case 0: {
		exit(0); break;
	}
	case 1: {
		query(); break;
	}
	case 2: {
		break;
	}
	}
}
void del() {
	system("cls");
	printf("以下为注销卡的菜单界面\n");
	printf("请输入需要注销的卡号(长度1-18):\n");
	char no[50];
	scanf("%s", no);
	while (strlen(no) > 18 || queryCard(card, no) == NULL) {
		if (strlen(no) > 18) printf("卡号超过18位,请重新输入卡号(长度1-18):\n");
		else printf("该卡号不存在请重新输入卡号(长度1-18):\n");
		scanf("%s", no);
	}
	if (delCard(card, no) == 1) printf("删除成功!\n");
	else printf("删除失败!\n");
	int i;
	printf("1.继续删除\n");
	printf("2.返回上级菜单\n");
	printf("0.退出\n");
	scanf("%d", &i);
	switch (i) {
	case 0: {
		exit(0); break;
	}
	case 1: {
		del(); break;
	}
	case 2: {
		break;
	}
	}
}

card.h
卡信息头文件

#ifndef Card_H
#define Card_H
typedef struct Card {
	char      aName[18];  //卡号
	char      aPwd[8];       //密码
	int         nStatus;         //卡状态(0-未上机;1-正在上机;2-已注销;3-失效)
	time_t    tStart;            //开卡时间
	time_t    tEnd;             //卡的截止时间
	float       fTotalUse;     //累计金额
	time_t    tLast;            //最后使用时间
	int          nUseCount;  //使用次数
	float       fBalance;      //余额
	int          nDel;            //删除标识 0-未删除,1-删除
	struct Card* next;            //指向下一个卡的指针
}Card;
void addCard(Card *card,char no[],char pwd[],float balance);
Card* initial();
Card* queryCard(Card *card,char no[]);
int delCard(Card *card, char no[]);
Card* showCard();
#endif

card.cpp
卡信息源文件

#define _CRT_SECURE_NO_WARNINGS//消除scanf警告
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "card.h"
//#include "card_file.h"
#include "time.h"
void addCard(Card *card,char no[],char pwd[],float balance) {
	Card *t;
	t = (Card*)malloc(sizeof(Card));
	strcpy(t->aName, no);
	strcpy(t->aPwd, pwd);
	t->nStatus = 0;
	t->fTotalUse = 0;
	t->fBalance = balance;
	t->nUseCount = 0;
	t->nDel = 0;
	t->tLast = time(NULL);
	t->tStart = time(NULL);
	t->tEnd = t->tLast + 60 * 60 * 24 * 365;
	t->next = card->next;
	card->next = t;
	//saveCard(t);
}
Card* initial() {
	Card *card;
	card= (Card*)malloc(sizeof(Card));
	card->next = NULL;
	return card;
}
Card* queryCard(Card *card,char no[]) {
	Card *t = card->next;
	int flag = 0;
	for (; t != NULL ; t = t->next) {
		if (strcmp(t->aName, no) == 0) {
			flag = 1;
			break;
		}
	}
	if(flag) return t;
	else return NULL;
}
int delCard(Card *card, char no[]) {
	Card *t = card->next;
	Card *p = card;
	int flag = 0;
	for (; t != NULL; p=t,t = t->next) {
		if (strcmp(t->aName, no) == 0) {
			flag = 1;
			p->next = t->next;
			t->nDel = 1;
			free(t);
			break;
		}
	}
	return flag;
}
/*
Card* showCard() {
	Card *card=initial();
	card=readCard();
	return card;
}
*/
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值