图书管理系统: 只是一个简易版的、只是完成一些简单的增删改查的功能。
把图书表抽象成一个线性表,每本图书(包括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; } } }录入书籍 打印书籍信息 书籍查找 修改书籍 查看书籍总量 删除书籍 退出系统