图书管理系统——C语言版

图书管理系统:
只是一个简易版的、只是完成一些简单的增删改查的功能。

设计要求

把图书表抽象成一个线性表,每本图书(包括ISBN、书名、定价)作为线性表中的一个元素。在图书信息管理信息系统中要求实现查找,插入,删除,修改和计数功能。

设计思路

创建书籍结构体
首先,需要创建一个结构体来存储图书信息,结构体中包含ISBN、书名和定价;其中ISBN和书名可以用char类型的数组来存储,而定价因为可能有小数部分,所以需要double类型来定义:

typedef struct Book{	//定义书籍信息
	char ISBN[20];
	char bookName[20];
	double Price;
}Book;

创建链表节点
下来就是创建链表节点,链表有两个域,data域和next域,而data域里边存放的是书籍的三个信息,所以data的类型就是如上定义的Book类型:

typedef struct LNode{		//定义书籍节点
	Book data;
	struct LNode * next;
}LNode, *LinkList;

初始化链表
完成的第一个功能是初始化链表,初始化链表需要把头节点的next域指向NULL,data域不做要求;需要加一个判断语句,如果next已经指向NULL,则直接返回就可以:

void InitList(LinkList list)		//初始化链表
{
	if (list->next == NULL)
	{
		return;
	}
	list->next = NULL;
}

遍历链表且打印
第二个功能是打印链表当中已经存放的书籍,简而言之,就是链表的遍历,需要定义一个指针,这个指针从头节点开始,一直指向到尾节点,其中每指向一个节点,打印节点的data域中的三个值就可以:

void Show(LinkList list)		//打印
{
	LNode *pCur = list->next;
	while (pCur != NULL)
	{
		printf("%s ", pCur->data.ISBN);
		printf("%10s ", pCur->data.bookName);
		printf("%6d ", pCur->data.Price);
		printf("\n");
		pCur = pCur->next;
	}
	printf("\n");
}

生成一个节点
这里把生成一个节点单独写成一个函数,可以方便在其他函数中调用;生成一个节点,并把书籍信息存放入这个节点中,且把节点的next指向NULL,需要注意的是,因为书名和ISBN号在上面定义的是char数组类型的,所以需要用的strcpy函数,不可以直接赋值:

LNode *GetNode(Book book)//生成一个节点
{
	LNode * pGet = (LNode *)malloc(sizeof(LNode));
	strcpy(pGet->data.bookName, book.bookName);
	strcpy(pGet->data.ISBN, book.ISBN);
	pGet->data.Price = book.Price;
	pGet->next = NULL;
	return pGet;
}

插入书籍信息
需要完成的功能是向链表中插入书籍的信息,这里采用的是尾插法,从头节点一直往后插入,具体实现是先从头节点往后查找,当查找到next域指向NULL时,把next指向改成要插入的节点,就可以:

void InsertTailList(LinkList list, Book book)		//尾插
{
	LNode *pCur = list;
	while ((pCur->next) != NULL)
	{
		pCur = pCur->next;
	}
	LNode *pGet = GetNode(book);
	pCur->next = pGet;
}

查找书籍
需要完成查找书籍的功能,采用的是按书名查找,用户输入需要查找的书籍书名,然后在链表中遍历,当链表中查找的书籍书名和用户输入的书名一致时,返回节点信息,打印节点三个元素就可以:

LNode *nameFind(LinkList list, char *name)	//书名查找
{
	LNode *pCur = list->next;
	while (strcmp(pCur->data.bookName, name))
	{
		pCur = pCur->next;
	}
	return pCur;
}

删除书籍信息
需要完成删除链表中用户指定的书籍信息,用户指定删除的节点,将该节点删除,只需要把前一个节点的next指向后一个节点就可以:

void Delete(LinkList list, int val)		//删除第val本书籍
{
	LNode* pCur = list;
	int count = 1;
	while (count != val)
	{
		pCur = pCur->next;
		count++;
	}
	pCur->next = pCur->next->next;
}

得到系统的书籍本数
需要知道系统中一共存放了多少本书籍,采用链表的遍历,定义一个指针,从头往后遍历,每遍历一个节点,将count加一,当next为NULL时,返回count就可以:

int Getlength(LinkList list)	//得到长度
{
	int count = 0;
	LNode* pCur = list->next;
	while (pCur != NULL)
	{
		count++;
		pCur = pCur->next;
	}
	return count;
}

修改书籍
将用户指定的书籍修改成用户重新录入的书籍信息,直接在链表中找,找到直接对节点的data域的三个元素重新赋值就可以:

void Modify(LinkList list, int val,Book book)//修改书籍
{
	int tmp = 1;
	LNode* pCur = list->next;
	while (tmp != val)
	{
		pCur = pCur->next;
		tmp++;
	}
	strcpy(pCur->data.ISBN, book.ISBN);
	strcpy(pCur->data.bookName, book.bookName);
	pCur->data.Price = book.Price;
}

退出程序
用户希望退出程序的话,直接输入0,在switch()case{}语句中直接退出就可以

case 0:			//退出程序
{
	printf("退出系统成功!\n");
	count = 0;
}

Main函数
需要打印一个图书管理系统的菜单,列出选项,采用switch()case{}语句对用户输入的数字进行相对应的操作:

int main()
{
	printf("=============================\n");
	printf("        图书管理系统\n");
	printf("         1、初始化系统\n");
	printf("         2、查看当前存放的书籍\n");
	printf("         3、向系统录入书籍\n");
	printf("         4、查找书籍\n");
	printf("         5、删除书籍\n");
	printf("         6、查看当前书籍总量\n");
	printf("         7、修改书籍信息\n");
	printf("         0、退出系统\n");
	printf("\n");
	printf("=============================\n");	int tmp;
	int count = 1;
	LNode list;
	InitList(&list);
	while (count){
		printf("请输入你的操作\n");
		scanf_s("%d", &tmp);
		switch (tmp)
		{
		case 1:
		{
			InitList(&list);
			printf("初始化完成!\n");
			count = 1;
			break;
		}
		case 2:
		{
			Show(&list);
			count = 1;
			break;
		}
		case 3:
		{
			int ret = 0;
			printf("你想输入多少本书籍?");
			scanf_s("%d", &ret);
			for (int i = 0; i < ret; i++)
			{
				Book book;
				printf("书籍的ISBN号:");
				scanf("%s", book.ISBN);
				printf("书名:");
				scanf("%s", book.bookName);
				printf("书籍价格:");
				scanf_s("%d", &book.Price);
				InsertTailList(&list, book);
				printf("录入完成!\n");
			}
			count = 1;
			break;
		}
		case 4:
		{
			char arr[10] = { NULL };
			printf("请输入要查找书籍的书名:");
			scanf("%s", arr);
			printf("%s", nameFind(&list, arr)->data.ISBN);
			printf("%10s ", nameFind(&list, arr)->data.bookName);
			printf("%6d ", nameFind(&list, arr)->data.Price);
			printf("\n");
			break;
		}
		case 5:
		{
			int val = 0;
			printf("请输入想删除第几本书!");
			scanf_s("%d", &val);
			Delete(&list, val);
			printf("删除成功!");
			count = 1;
			break;
		}
		case 6:
		{
			printf("当前书库有%d本书籍!\n",Getlength(&list));
			count = 1;
			break;
		}
		case 7:
		{
			int val = 0;
			Book book;
			printf("请输入你想修改第几本书籍!");
			scanf("%d", &val);
			printf("书籍的ISBN号:");
			scanf("%s", book.ISBN);
			printf("书名:");
			scanf("%s", book.bookName);
			printf("书籍价格:");
			scanf_s("%d", &book.Price);
			Modify(&list, val,book);
			printf("修改成功!");
			count = 1;
			break;
		}
		case 0:
		{
			printf("退出系统成功!\n");
			count = 0;
		}
		default:
			break;
		}
	}

}

源程序

#include
#include
typedef struct Book{				//定义书籍信息
	char ISBN[20];
	char bookName[20];
	double Price;
}Book;

typedef struct LNode{			//定义书籍节点
	Book data;
	struct LNode * next;
}LNode, *LinkList;

void InitList(LinkList list)		//初始化链表
{
	if (list->next == NULL)
	{
		return;
	}
	list->next = NULL;
}

LNode *GetNode(Book book)//生成一个节点
{
	LNode * pGet = (LNode *)malloc(sizeof(LNode));
	strcpy(pGet->data.bookName, book.bookName);
	strcpy(pGet->data.ISBN, book.ISBN);
	pGet->data.Price = book.Price;
	pGet->next = NULL;
	return pGet;
}

void InsertTailList(LinkList list, Book book)//尾插
{
	LNode *pCur = list;
	while ((pCur->next) != NULL)
	{
		pCur = pCur->next;
	}
	LNode *pGet = GetNode(book);
	pCur->next = pGet;
}

LNode *nameFind(LinkList list, char *name)	//书名查找
{
	LNode *pCur = list->next;
	while (strcmp(pCur->data.bookName, name))
	{
		pCur = pCur->next;
	}
	return pCur;
}

void Delete(LinkList list, int val)	//删除第val本书籍
{
	LNode* pCur = list;
	int count = 1;
	while (count != val)
	{
		pCur = pCur->next;
		count++;
	}
	pCur->next = pCur->next->next;
}

int Getlength(LinkList list)	//得到长度
{
	int count = 0;
	LNode* pCur = list->next;
	while (pCur != NULL)
	{
		count++;
		pCur = pCur->next;
	}
	return count;
}

void Modify(LinkList list, int val,Book book)//修改书籍
{
	int tmp = 1;
	LNode* pCur = list->next;
	while (tmp != val)
	{
		pCur = pCur->next;
		tmp++;
	}
	strcpy(pCur->data.ISBN, book.ISBN);
	strcpy(pCur->data.bookName, book.bookName);
	pCur->data.Price = book.Price;
}

void Show(LinkList list)	//打印
{
	LNode *pCur = list->next;
	while (pCur != NULL)
	{
		printf("%s ", pCur->data.ISBN);
		printf("%10s ", pCur->data.bookName);
		printf("%6d ", pCur->data.Price);
		printf("\n");
		pCur = pCur->next;
	}
	printf("\n");
}
int main()
{
	printf("=============================\n");
	printf("        图书管理系统\n");
	printf("         1、初始化系统\n");
	printf("         2、查看当前存放的书籍\n");
	printf("         3、向系统录入书籍\n");
	printf("         4、查找书籍\n");
	printf("         5、删除书籍\n");
	printf("         6、查看当前书籍总量\n");
	printf("         7、修改书籍信息\n");
	printf("         0、退出系统\n");
	printf("\n");
	printf("=============================\n");
	int tmp;
	int count = 1;
	LNode list;
	InitList(&list);
	while (count){
		printf("请输入你的操作\n");
		scanf_s("%d", &tmp);
		switch (tmp)
		{
		case 1:
		{
			InitList(&list);
			printf("初始化完成!\n");
			count = 1;
			break;
		}
		case 2:
		{
			Show(&list);
			count = 1;
			break;
		}
		case 3:
		{
			int ret = 0;
			printf("你想输入多少本书籍?");
			scanf_s("%d", &ret);
			for (int i = 0; i < ret; i++)
			{
				Book book;
				printf("书籍的ISBN号:");
				scanf("%s", book.ISBN);
				printf("书名:");
				scanf("%s", book.bookName);
				printf("书籍价格:");
				scanf_s("%d", &book.Price);
				InsertTailList(&list, book);
				printf("录入完成!\n");
			}
			count = 1;
			break;
		}
		case 4:
		{
			char arr[10] = { NULL };
			printf("请输入要查找书籍的书名:");
			scanf("%s", arr);
			printf("%s", nameFind(&list, arr)->data.ISBN);
			printf("%10s ", nameFind(&list, arr)->data.bookName);
			printf("%6d ", nameFind(&list, arr)->data.Price);
			printf("\n");
			break;
		}
		case 5:
		{
			int val = 0;
			printf("请输入想删除第几本书!");
			scanf_s("%d", &val);
			Delete(&list, val);
			printf("删除成功!");
			count = 1;
			break;
		}
		case 6:
		{
			printf("当前书库有%d本书籍!\n",Getlength(&list));
			count = 1;
			break;
		}
		case 7:
		{
			int val = 0;
			Book book;
			printf("请输入你想修改第几本书籍!");
			scanf("%d", &val);
			printf("书籍的ISBN号:");
			scanf("%s", book.ISBN);
			printf("书名:");
			scanf("%s", book.bookName);
			printf("书籍价格:");
			scanf_s("%d", &book.Price);
			Modify(&list, val,book);
			printf("修改成功!");
			count = 1;
			break;
		}
		case 0:
		{
			printf("退出系统成功!\n");
			count = 0;
		}
		default:
			break;
		}
	}

}

运行结果

录入书籍
图书管理系统——C语言版_第1张图片
打印书籍信息
在这里插入图片描述
书籍查找
在这里插入图片描述
修改书籍
图书管理系统——C语言版_第2张图片
查看书籍总量
在这里插入图片描述
删除书籍
图书管理系统——C语言版_第3张图片
退出系统
在这里插入图片描述

你可能感兴趣的:(C语言)