还有很多bug 的 图书管理系统
看着视频教学 写的 添加了文字颜色等
能力有限 就这个小东西都还没有吃透 ,
还有很多bug 比如输入错误会 一直循环 等等
学c语言 指针结构体 后面这部分就学了皮毛还是理解太差了 ,后面会改进
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdbool.h>#include <Windows.h>typedef struct Node { //书的结构体 节点struct Node * Upper; //Upper 上 指向上的指针struct Node * Lower; //Lower 下 指向下的指针char BookName[100]; //定义书名float Bookprice; //定义书价int BookNumber; //定义书号};int nNodeCount = 0; //节点总数的计数struct Node* nDHeaderNode = NULL;//增加函数struct Node * AppendNode(struct Node * CurrentNode, char * BookName, int BookNumber, float Bookprice);//查询函数void QueryNode(struct Node* HeaderNode, char* BookName);//修改函数void ModifyNode(struct Node* HeaderNode, char* BookName, float Bookprice);//删除的函数void DeleteNode(struct Node* HeaderNode, char* BookName);//颜色void color(short x);int main(){while (true){color(14);int ReadFlag = 0;char szBookName[100]; //书名float fBookprice; // 书价int nBookNumber; //书号float fNewBookprice; //新的书价printf("-------------------------------请输入您需要的功能---------------------------------\n");printf(" 1: 添加书籍信息 \n");printf(" 2: 查询书籍信息 \n");printf(" 3: 修改书籍信息 \n");printf(" 4: 删除书籍信息 \n");scanf("%d", &ReadFlag);switch (ReadFlag){system("cls");case 1:memset(szBookName, 0, 50);printf(" 请输入书名:\n");scanf("%s", szBookName);printf(" 请输入定价:\n");scanf("%f", &fBookprice);printf(" 请输出书号:\n");scanf("%d", &nBookNumber);//新增的函数nDHeaderNode = AppendNode(nDHeaderNode, szBookName, nBookNumber, fBookprice);break;case 2:memset(szBookName, 0, 50);printf(" 请输出书名:\n");scanf("%s", szBookName);//code 查询的函数QueryNode(nDHeaderNode,szBookName);break;case 3:memset(szBookName, 0, 50);printf(" 请输入书名:\n");scanf("%s", szBookName);printf(" 请输入新定价:\n");scanf("%f", &fNewBookprice);//code 修改的函数ModifyNode(nDHeaderNode, szBookName, fNewBookprice);break;case 4:memset(szBookName, 0, 50);printf(" 请输入书名:\n");scanf("%s", szBookName);//code 删除的函数DeleteNode(nDHeaderNode, szBookName);break;default:break;}}return 0;}struct Node * AppendNode(struct Node * CurrentNode, char * BookName, int BookNumber, float Bookprice) //Current 当前节点{struct Node * pNewNode = NULL; //pNewNode 新的节点struct Node * pTempNode = NULL; // pTempNode 临时节点struct Node* pHeadNode = CurrentNode; //pHeadNode 头节点pNewNode = (struct Node*)malloc(sizeof(struct Node)); //申请 一个节点(Node)那么大的内存 malloc 申请内存if (pNewNode == NULL){printf("Failed to request memory!\n"); //申请内存失败return pNewNode;}if (CurrentNode == NULL) // 等于NULL 就是空链表{CurrentNode = pNewNode; // 开辟出内存空间的新节点 ,赋值给当前节点CurrentNode->Upper = NULL; //当前节点的上下节点 都置为空 前后都没有值CurrentNode->Lower = NULL;}else{while(pHeadNode->Lower!=NULL) //头节点 指向下一个节点 不等于 NULL{pTempNode = pHeadNode;pHeadNode = pHeadNode->Lower;}pHeadNode->Lower = pNewNode;pHeadNode->Upper = pTempNode;}strcpy(pNewNode->BookName, BookName); //拷贝书名pNewNode->Bookprice = Bookprice; //新的节点的定价等于参数的定价pNewNode->BookNumber = BookNumber; //新的节点的书号等于参数的书号pNewNode->Lower = NULL; //新节点的下一个节点置空nNodeCount++; //计数器自增return CurrentNode; //返回当前节点}void QueryNode(struct Node* HeaderNode, char* BookName){if (HeaderNode == NULL){printf(" error:查询失败,没有该书籍\n");return;}for (size_t i = 0; i < nNodeCount; i++) //for循环遍历{if (strcmp(HeaderNode->BookName, BookName) == 0) //strcmp = 0 才是 正确{printf(" 图书书名:%s\n", HeaderNode->BookName);printf(" 图书定价:%f\n", HeaderNode->Bookprice);printf(" 图书书号:%d\n", HeaderNode->BookNumber);return;}HeaderNode = HeaderNode->Lower;}printf("Query Node Failed\n");}void ModifyNode(struct Node * HeaderNode, char* BookName, float Bookprice){if (HeaderNode == NULL){printf(" error:查询失败没有书籍\n");return;}if (strcmp(HeaderNode->BookName,BookName)== 0){HeaderNode->Bookprice = Bookprice;printf("Modify Success !\n");return;}while (HeaderNode->Lower != NULL){HeaderNode = HeaderNode->Lower;if (strcmp(HeaderNode->BookName, BookName) == 0){HeaderNode->Bookprice = Bookprice;printf("Modify Success !\n");return;}}printf("ModifyNode failed!");return;}void DeleteNode( struct Node* HeaderNode, char* BookName){struct Node * pNode = NULL; //定义一个指针临时节点pNode = HeaderNode; //临时节点指向头节点for (size_t i = 0; i < nNodeCount; i++) //{if (strcmp(pNode->BookName,BookName)==0) // 比较名字是否一样 ,一样等于 0{if (pNode == HeaderNode) // 相等删除的就是头节点{pNode = HeaderNode->Lower; // 头节点指向下一个节点free(HeaderNode); //释放内存空间函数free 调用形式: free(void *ptr);nDHeaderNode = pNode; //全局头节点 指向 pNode临时节点HeaderNode = nDHeaderNode;nNodeCount--; //总数减一 因为删除了一个节点所以减一return;}if (pNode->Lower == NULL){pNode->Upper->Lower = NULL; //当前的临时节点 指向上一个节点 指向下一个节点free(pNode); //上的下一个节点,指向的就是自己,把自己free掉nNodeCount--;printf("Delete Success!\n"); //删除成功return;}pNode->Upper->Lower = pNode->Lower; //当前节点指向上一个节点-指向下一个节点 = 当前节点 指向下一个节点pNode->Lower->Upper = pNode->Upper;free(pNode); //把当前节点空出来了 就free掉nNodeCount--;printf("Delete Success!\n");return;}pNode = pNode->Lower;}}void color(short x){if (x >= 0 && x <= 15){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);}else{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);}}
