还有很多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);
}
}