C语言双向链表学习

发布时间 2023-10-07 18:41:27作者: Xinux

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;
}