C语言双向链表学习
C语言双向链表学习
编程是安全狗必不可少的一项技能,今日所书写的内容就是学习中的一些内容。
双向链表小项目 “图书管理系统” 它又叫DobleLinkBookLibrarySystemProject没想到吧,这么个小东西还有这么吊的名字!
release版本:成品下载
代码:
头文件 fuzz.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
struct Book* AppendBook(struct Book* CurrentBook, char * bookName, int bookNumber, float bookPrice);
int main();
c文件
BookLibraryEntry.c
#include "fuzz.h"
struct Book {
int BookNumber;
char BookName[50];
float BookPrice;
struct Book* UpLink;
struct Book* DownLink;
};
//书籍头节点
struct Book* Books = NULL;
//
int nCount = 0;
//添加书籍
struct Book* AppendBook(struct Book* CurrentBook,char * bookName,int bookNumber, float bookPrice) {
//1空节点 是第一次添加
if (CurrentBook==NULL)
{
CurrentBook = (struct Book*)malloc(sizeof(struct Book));
CurrentBook->BookNumber = bookNumber;
strncpy(CurrentBook->BookName, bookName,50);
CurrentBook->BookPrice = bookPrice;
CurrentBook->UpLink = NULL;
CurrentBook->DownLink = NULL;
nCount++;
system("cls");
printf("添加成功!\n");
system("pause");
system("cls");
//syste
return CurrentBook;
}
else
{
struct Book * TempBookNode = (struct Book*)malloc(sizeof(struct Book));
CurrentBook->DownLink = TempBookNode;
TempBookNode->UpLink = CurrentBook;
TempBookNode->BookNumber = bookNumber;
strncpy(TempBookNode->BookName, bookName, 50);
TempBookNode->BookPrice = bookPrice;
TempBookNode->DownLink = NULL;
nCount++;
system("cls");
printf("添加成功!\n");
system("pause");
system("cls");
return TempBookNode;
}
}
//查询所有书籍
void QueryALLBooks(struct Book* CurrentBook) {
if (CurrentBook==NULL)
{
printf("图书馆内没有书籍,请先添加书籍!\n");
return;
}
/*while (CurrentBook->UpLink!=NULL)
{
printf("编号:%d 书名:%s 价格:%f\n", CurrentBook->BookNumber, CurrentBook->BookName, CurrentBook->BookPrice);
CurrentBook = CurrentBook->UpLink;
}*/
if (CurrentBook->UpLink==NULL)
{
printf("编号:%d 书名:%s 价格:%f\n", CurrentBook->BookNumber, CurrentBook->BookName, CurrentBook->BookPrice);
}
else {
for (size_t i = 0; i < (nCount-1); i++)
{
//printf("编号:%d 书名:%s 价格:%f\n", CurrentBook->BookNumber, CurrentBook->BookName, CurrentBook->BookPrice);
CurrentBook = CurrentBook->UpLink;
}
for (size_t i = 0; i < nCount; i++)
{
printf("编号:%d 书名:%s 价格:%f\n", CurrentBook->BookNumber, CurrentBook->BookName, CurrentBook->BookPrice);
CurrentBook = CurrentBook->DownLink;
}
}
}
bool QueryTheBook(struct Book* CurrentBook, char* bookName) {
for (size_t i = 0; i < (nCount - 1); i++)
{
//printf("编号:%d 书名:%s 价格:%f\n", CurrentBook->BookNumber, CurrentBook->BookName, CurrentBook->BookPrice);
CurrentBook = CurrentBook->UpLink;
}
for (size_t i = 0; i < nCount; i++)
{
//printf("%s\n", CurrentBook->BookName);
if (!strcmp(CurrentBook->BookName,bookName))
{
system("cls");
printf("已经找到《%s》这本书!\n", bookName);
printf("编号:%d 书名:%s 价格:%f\n", CurrentBook->BookNumber, CurrentBook->BookName, CurrentBook->BookPrice);
return true;
}
CurrentBook = CurrentBook->DownLink;
}
return false;
}
void Menu() {
printf(" ======Xinux Ver1.0==========\n");
printf("||1.添加书籍 =\n");
printf("||2.查询所有书籍 =\n");
printf("||3.查询指定书籍 =\n");
printf("||4.修改书籍价格 =\n");
printf("||5.删除书籍 =\n");
printf(" ============================\n");
//system("color a");
}
bool ModifyBookPrice(struct Book* CurrentBook, char* bookName) {
for (size_t i = 0; i < (nCount - 1); i++)
{
CurrentBook = CurrentBook->UpLink;
}
for (size_t i = 0; i < nCount; i++)
{
//printf("%s\n", CurrentBook->BookName);
if (!strcmp(CurrentBook->BookName, bookName))
{
printf("已经找到《%s》这本书!当前价格为%f .\n", bookName,CurrentBook->BookPrice);
char* tmpbkName = CurrentBook->BookName;
int tmpbkNumber = CurrentBook->BookNumber;
float tmpbkPrice = CurrentBook->BookPrice;
printf("请输入最新价格:");
float newPrice = 0;
scanf("%f", &newPrice);
CurrentBook->BookPrice = newPrice;
printf("原-->编号:%d 书名:%s 价格:%f\n", tmpbkNumber, tmpbkName, tmpbkPrice);
printf("新-->编号:%d 书名:%s 价格:%f\n", CurrentBook->BookNumber, CurrentBook->BookName, CurrentBook->BookPrice);
return true;
}
CurrentBook = CurrentBook->DownLink;
}
return false;
}
bool DelBook(struct Book** pBooks, char* bookName) {
struct Book* CurrentBook = *pBooks;
// 查找要删除的书籍
while (CurrentBook != NULL) {
if (strcmp(CurrentBook->BookName, bookName) == 0) {
printf("已经找到《%s》这本书!正在执行删除操作.\n", bookName);
// 保存要删除的节点的前一个和后一个节点
struct Book* prevBook = CurrentBook->UpLink;
struct Book* nextBook = CurrentBook->DownLink;
// 释放要删除的节点的内存
free(CurrentBook);
// 更新链表连接
if (prevBook != NULL) {
prevBook->DownLink = nextBook;
}
else {
// 如果删除的是第一个节点,更新头节点指针
*pBooks = nextBook;
}
if (nextBook != NULL) {
nextBook->UpLink = prevBook;
}
nCount--;
return true;
}
CurrentBook = CurrentBook->DownLink;
}
// 未找到要删除的书籍
return false;
}
int main() {
//命令
int inCmd = 0;
char BookName[50];
int BookNumber = 0;
float BookPrice = 0.0;
while (1)
{
Menu();
printf("请输入相关指令:");
scanf("%d", &inCmd);
switch (inCmd)
{
case 1:
//添加书籍
memset(BookName, 0, 50);
printf("请输入书籍名称:\n");
scanf("%s", BookName);
printf("请输入书籍编号:\n");
scanf("%d", &BookNumber);
printf("请输入书籍价格:\n");
scanf("%f", &BookPrice);
Books = AppendBook(Books,BookName,BookNumber,BookPrice);
break;
case 2:
//查询所有书籍
system("cls");
QueryALLBooks(Books);
system("pause");
system("cls");
break;
case 3:
//查询指定书籍
if (nCount==0)
{
system("cls");
printf("图书馆里没有书,请先添加书籍.\n");
system("pause");
system("cls");
break;
}
memset(BookName, 0, 50);
printf("请输入要查询的指定书籍名称:\n");
scanf("%s", BookName);
bool isFound = QueryTheBook(Books, BookName);
if (!isFound) {
system("cls");
printf("无此书籍!\n");
system("pause");
}
else
{
system("pause");
system("cls");
}
break;
case 4:
//修改书籍价格
if (nCount == 0)
{
system("cls");
printf("图书馆里没有书,请先添加书籍.\n");
system("pause");
system("cls");
break;
}
memset(BookName, 0, 50);
printf("请输入要修改价格的书籍名称:\n");
scanf("%s", BookName);
bool isTrue = ModifyBookPrice(Books,BookName);
if (isTrue)
{
printf("修改成功!\n");
system("pause");
system("cls");
}
else
{
printf("修改失败!\n");
system("pause");
system("cls");
}
break;
case 5:
//删除书籍
if (nCount == 0)
{
system("cls");
printf("图书馆里没有书,请先添加书籍.\n");
system("pause");
system("cls");
break;
}
printf("请输入要删除的书籍名称:\n");
scanf("%s", BookName);
if (DelBook(&Books, BookName)) {
printf("删除成功!\n");
system("pause");
system("cls");
}
else
{
printf("删除失败!\n");
system("pause");
system("cls");
}
break;
default:
break;
}
}
return 0;
}