图书管理系统
可能有点bug,没具体测试
期末作业写的很拉胯
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct book_info
{
	char* book_num;
	char* book_name;
	char* author_name;
	char* publisher;
	int year;
	int mon;
	int day;
	double price;
}infom;
typedef struct book_node
{
	infom book;
	struct book_node* next;
}book_node, * Llist;
//创建表头
struct book_node* createHead();
void menu();
//创建头结点
struct book_node* Create_book_Doc();
int IsRightDate(int year, int mon, int day);
int Mday(int year, int mon);
int IsLeapYear(int year);
//打印整个链表
void Print_All_booknode(struct book_node* head);
//打印某一节点
void Print_node(struct book_node* node);
//冒泡排序
void BubbleSortOfList(struct book_node* list);
//书名查找
void SearchNodePrintByName(struct book_node* list);
//书号查找删除
void SearchNodeDelByNum(struct book_node* list);
//书号查找修改
struct book_node* SearchNodeModifyByNum(struct book_node* list, struct book_node* L);
void ModifyInfom(struct book_node* node);
#define _CRT_SECURE_NO_WARNINGS 1
#include "book.h"
int main()
{
	//创建头结点
	struct book_node* List = createHead();
	//两个临时节点
	struct book_node* node = NULL, * p = NULL;
	char ch = 0;
	int flag = 1;
	do
	{
		menu();
		scanf("%c%*c", &ch);
		switch (ch)
		{
		case 'a':
		case 'A':
			 p = Create_book_Doc();
			 if (flag)
			 {
				 List->next = p;
				 flag = 0;
			 }
			 else
			 {
				 node->next = p;
			 }
			 node = p;
			break;
		case 'f':
		case 'F':
			SearchNodePrintByName(List);
			break;
		case 'r':
		case 'R':
			SearchNodeDelByNum(List);
			break;
		case 'm':
		case 'M':
			node = SearchNodeModifyByNum(List,node);
			break;
		case 's':
		case 'S':
			BubbleSortOfList(List);
			Print_All_booknode(List);
			break;
		case 'q':
		case 'Q':
			printf("Thank you! Goodbye!\n");
			ch = 0;
			break;
		default :
			printf("Incorrect choice!");
			break;
		}
	} while (ch);
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "book.h"
void menu()
{
	printf("Append Find Remove Modify Show Quit > ");
}
struct book_node* createHead()
{
	struct book_node* headnode = (struct book_node*)malloc(sizeof(struct book_node));
	headnode->next = NULL;
	return headnode;
}
struct book_node* Create_book_Doc()
{
	//临时变量
	struct book_node* p ;
	char* book_num;
	char* book_name;
	char* author_name;
	char* publisher;
	//定义储存空间
	book_num = (char*)malloc(8);
	book_name = (char*)malloc(8);
	author_name = (char*)malloc(8);
	publisher = (char*)malloc(8);
	//定义临时变量,赋值给节点
	int year = -1;
	int mon = -1;
	int day = -1;
	double price;
	//计算结构体的大小
	int sz = sizeof(struct book_node);
	//输入储存数据
	printf("     ISBN: ");
	scanf("%s", book_num);
	printf("    Title: ");
	//读取'\n'
	getchar();
	gets(book_name);
	printf("   Author: ");
	gets(author_name);
	printf("Publisher: ");
	gets(publisher);
	printf(" Pub date: ");
	//判断日期是否正确
	//有点问题
	scanf("%d/%d/%d", &year, &mon, &day);
	while (!IsRightDate(year, mon, day))
	{
		printf("Incorrect date! Please reenter: ");
		scanf("%d/%d/%d", &year, &mon, &day);
	}
	printf("    Price: ");
	scanf("%lf", &price);
	//读取空格
	getchar();
	//赋值
	p = (struct book_node*)malloc(sz);
	p->book.book_num = book_num;
	p->book.book_name = book_name;
	p->book.author_name = author_name;
	p->book.publisher = publisher;
	p->book.day = day;
	p->book.mon = mon;
	p->book.year = year;
	p->book.price = price;
	p->next = NULL;
	return p;
}
int IsRightDate(int year, int mon, int day)
{
	if (year > 0)
	{
		if (mon > 0 && mon < 13)
		{
			if (day > 0 && day <= Mday(year, mon))
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
		else
		{
			return 0;
		}
	}
	else
	{
		return 0;
	}
}
int Mday(int year, int mon)
{
	int M = 0;
	if (year > 0)
	{
		switch (mon)
		{
		case 1: M = 31; break;
		case 2: M = 28 + IsLeapYear(year); break;
		case 3: M = 31; break;
		case 4: M = 30; break;
		case 5: M = 31; break;
		case 6: M = 30; break;
		case 7: M = 31; break;
		case 8: M = 31; break;
		case 9: M = 30; break;
		case 10: M = 31; break;
		case 11: M = 30; break;
		case 12: M = 31; break;
		}
	}
	return M;
}
int IsLeapYear(int year)
{
	return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
void Print_All_booknode(struct book_node* head)
{
	//如果头为空返回
	struct book_node* ptr;
	if (head == NULL)
	{
		return;
	}
	//循环打印
	printf("ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---\n");
	for (ptr = head ->next; ptr; ptr = ptr->next)
	{
		printf("%-13s ", ptr->book.book_num);
		printf("%-30s ", ptr->book.book_name);
		printf("%-20s ", ptr->book.author_name);
		printf("%-30s ", ptr->book.publisher);
		printf("%04d/%02d/%02d ", ptr->book.year, ptr->book.mon, ptr->book.day);
		printf("%8.2f ", ptr->book.price);
		printf("\n");
	}
}
void BubbleSortOfList(struct book_node* list)
{
	//临时变量
	infom tmp;
	struct book_node* prt = NULL;
	struct book_node* qrt = NULL;
	//冒泡排序 
	for (prt = list->next; prt; prt = prt->next)
	{
		for (qrt = list->next; qrt->next; qrt = qrt->next)
		{
			if (strcmp(qrt->book.book_num, qrt->next->book.book_num) > 0 )
			{
				tmp = qrt->book;
				qrt->book = qrt->next->book;
				qrt->next->book = tmp;
			}
		}
	}
}
void Print_node(struct book_node* node)
{
	struct book_node* ptr = NULL;
	ptr = node;
	printf("%-13s ", ptr->book.book_num);
	printf("%-30s ", ptr->book.book_name);
	printf("%-20s ", ptr->book.author_name);
	printf("%-30s ", ptr->book.publisher);
	printf("%04d/%02d/%02d ", ptr->book.year, ptr->book.mon, ptr->book.day);
	printf("%8.2f ", ptr->book.price);
	printf("\n");
}
void SearchNodePrintByName(struct book_node* list)
{
	//定义数组,储存输入字符串
	char temp[31] = { 0 };
	//L指针,便利链表
	struct book_node* L = list->next;
	//查看是否找到
	int flag = 0;
	printf("Title: ");
	gets(temp);
	int num = 1;
	//查找
	while (L)
	{
		if (strcmp(temp, L->book.book_name) == 0)
		{
			if (num)
			{
				printf("ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---\n");
				num = 0;
			}
			Print_node(L);
			flag = 1;
		}
		L = L->next;
	}
	//没找到
	if (flag == 0)
	{
		printf("Not found!\n");
	}
}
void SearchNodeDelByNum(struct book_node* list)
{
	//定义数组,储存字符串
	char temp[14] = { 0 };
	printf("ISBN: ");
	gets(temp);
	//指针寻找delete位置
	struct book_node* p = NULL;
	p = list;
	//看是否寻找到
	int flag = 0;
	while (p->next != NULL)
	{
		if (strcmp(temp, p->next->book.book_num) == 0)
		{
			printf("Remove(y/n)? ");
			//循环条件
			int ok = 1;
			//读取字符
			char ch = 0;
			scanf("%c%*c", &ch);
			while (ok)
			{
				if (ch == 'y' || ch == 'Y')
				{
					ok = 0;
					flag = 1;
					struct book_node* mid = NULL;
					mid = p->next;
					p->next = mid->next;
					free(mid);
					return;
				}
				else if (ch == 'n' || ch == 'N')
				{
					ok = 0;
					flag = 1;
					return;
				}
				else
				{
					printf("Incorrect answer!\n");
					printf("Remove(y/n)? ");
					scanf("%c%*c", &ch);
				}
			}
			return;
		}
		p = p->next;
	}
	//不存在,没找到
	if (flag == 0)
	{
		printf("Not found!\n");
	}
}
struct book_node* SearchNodeModifyByNum(struct book_node* list, struct book_node* L)
{
	char temp[14] = { 0 };
	printf("ISBN: ");
	gets(temp);
	struct book_node* p = NULL;
	p = list;
	//看是否寻找到
	int flag = 0;
	while (p->next)
	{
		if (strcmp(temp, p->next->book.book_num) == 0)
		{
			printf("Modify(y/n)? ");
			
			//循环条件
			int ok = 1;
			char ch = 0;
			scanf("%c%*c", &ch);
			while (ok)
			{
				if (ch == 'y' || ch == 'Y')
				{
					ok = 0;
					flag = 1;
					if (p->next->next != NULL) 
					{
						ModifyInfom(p);
					}
					else
					{
						struct book_node* newnode = NULL;
						struct book_node* mid = NULL;
						mid = p->next;
						newnode = Create_book_Doc();
						p->next = newnode;
						free(mid);
						L = p->next;
					}
				}
				else if (ch == 'n' || ch == 'N')
				{
					ok = 0;
					flag = 0;
				}
				else
				{
					printf("Incorrect answer!\n");
					printf("Modify(y/n)? ");
					scanf("%c%*c", &ch);
				}
			}
		}
		p = p->next;
	}
	//不存在,没找到
	if (flag == 0)
	{
		printf("Not found!\n");
	}
	return L;
}
void ModifyInfom(struct book_node* node)
{
	struct book_node* newnode = NULL;
	newnode = Create_book_Doc();
	newnode->next = node->next->next;
	node->next = newnode;
}
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号