6.18. DS课设

本文档详细介绍了三个数据结构实验:图书信息管理系统、隐式图的搜索问题以及基于线性表和二叉排序树的低频词过滤系统。每个实验包含了实验内容、算法实现方案及完整代码,涵盖了链式存储、查找、排序和图搜索等概念。
摘要由CSDN通过智能技术生成

目录

实验一:图书信息管理系统的设计与实现

1.1实验内容

1.2算法实现方案

1.2.1实验流程图

1.2.2结构体定义

1.2.3函数实现

1.3完整代码

实验二:隐式图的搜索问题

2.1实验内容

2.2 算法实现方案

2.2.1伪代码

2.2.2实验流程图

2.2.3结构体定义

2.2.4函数实现

2.3完整代码

实验三:基于线性表和二叉排序树的低频词过滤系统

3.1实验内容

3.2算法实现方案

3.2.1伪代码

3.2.2结构体定义

3.2.3函数实现

3.3完整代码


实验一:图书信息管理系统的设计与实现

1.1实验内容

设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:

  1. 根据指定图书个数,逐个输入图书信息;
  2. 逐个显示图书表中所有图书的相关信息;
  3. 能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
  4. 根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
  5. 能统计表中图书个数;
  6. 实现图书信息表的图书去重;
  7. 实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
  8. 图书信息表按指定条件进行批量修改;
  9. 利用快速排序按照图书价格降序排序;
  10. 实现最贵图书的查找;

1.2算法实现方案

1.2.1实验流程图

1.2.2结构体定义

typedef struct {

    char no[8];   //8位书号

    char name[20]; //书名

    int price;     //价格

}Book;

typedef struct LNode{
    Book data;            //数据域
    struct LNode *next;   //指针域
}*LinkList;

1.2.3函数实现

1.菜单函数

void meau()
{
	cout << "                欢迎来到图书管理系统                  \n";
	cout << "----------------------------------------------------\n";
	cout << " *                   1.录入图书                      *\n";
	cout << " *                   2.显示所有图书的信息            *\n";
	cout << " *                   3.插入图书                      *\n";
	cout << " *                   4.删除图书                      *\n";
	cout << " *                   5.统计数量                      *\n";
	cout << " *                   6.图书去重                      *\n";
	cout << " *                   7.查找最喜欢图书                *\n";
	cout << " *                   8.图书价格修改                  *\n";
	cout << " *                   9.图书价格排序                  *\n";
	cout << " *                   10.最贵图书的查找               *\n";
	cout << " *                   11.退出系统                     *\n";
	cout << " *                   0.退出                          *\n";
	cout << "----------------------------------------------------\n";
	cout << "                    请输入选择:";
}

2.基于链式存储的图书信息表的图书去重

出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。读入相应的图书信息表(事先加入书号重复的记录),然后进行图书的去重,即删除书号重复的图书(只留第一本),最后输出去重后所有图书的信息。

总计输出m+1行(m<=n),其中,第一行是去重后的图书数目,后m行是去重后图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。

void deleteRepetitionBook(LinkList Head,LinkList Rear) {       //图书去重
	LinkList p = Head->next,q;              //前后指针遍历链表
	while (p) {
		q = p;
		while (q->next ) {
			if (strcmp(p->data.no, q->next->data.no) == 0) {     //判断图书书名是否相同
				if (q->next == Rear)Rear = q;
				q->next = q->next->next;
			}
			else q = q->next;
		}
		p = p->next;
	}
	numBook(Head);
	printBook(Head);
}

3.基于链式存储结构的图书信息表的旧书出库

读入指定的待出库的旧图书的书号,将该图书从图书表中删除,最后输出旧图书出库后所有图书的信息。输入待出库的旧图书的书号;若删除成功,输出旧图书出库后所有图书的信息(书号、书名、价格),每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。若删除失败,只输出以下提示:出库失败,未找到该图书!

void deleteBook(LinkList Head,LinkList Rear) {          //删除某一书号的图书
	LinkList p = Head;
	char ch;
	char num[8];
	bool t = true;
	int tag = 0;
	while (t) {
		if (Head->next == NULL) {
			cout << "暂无图书,删除失败!" << endl;
			return;
		}
		cout << "请输入待删除图书的书号:";
		cin >> num;
		while (p->next != NULL) {
			if (strcmp(p->next->data.no,num) == 0) {//等于0,则俩相同 
				tag = 1;
				if (p->next == Rear)Rear = p;//图书在最后一本的删除操作 
				p->next = p->next->next;//删除操作 
			}
			else p = p->next;
		} 
		if (tag == 1) {
			tag = 0;
			printBook(Head);
		}
		else cout << "出库失败,未找到该图书!"<<endl;
		cout << "是否继续删除?(Y为继续,其它退出)";
		cin >> ch;
		if (ch != 'y')t = false;          //输入y表示继续删除,否则结束删除
	}
}

4.基于链式存储结构的图书信息表的新书入库

读入指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置上,最后输出新图书入库后所有图书的信息。总计n+1行,首先输入第1行,内容仅为一个整数,代表待入库的新图书的位置序号,然后输入n行,内容为新图书的信息,书号、书名、价格用空格分隔。

输出若插入成功,输出新图书入库后所有图书的信息(书号、书名、价格),总计n+1行,每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。若插入失败,只输出以下提示:抱歉,入库位置非法!

void inputBook(LinkList Head, LinkList &Rear) {     //录入图书
	LinkList temp;
	char ch;
	int n = 1;//计数用 
	while (true) {
		temp=getpch(LNode);
		cout<<"请输入第"<<n<<"本书的书号:";
		cin>>temp->data.no;
		cout<<"请输入第"<<n<<"本书的书名:";
		cin>>temp->data.name ;
		cout<< "请输入第" << n << "本书的价格:";
		cin>> temp->data.price ;
		temp->next = NULL;
		Rear->next = temp;
		Rear = temp;//尾插法
		n++;
		cout << "是否继续录入?(Y为继续,其它退出)";
		cin >> ch;
		if (ch != 'y')break;
	}
}

5.基于链式存储结构的图书信息表的最爱图书的查找

读入相应的图书信息表,然后根据指定的最爱图书的名字,输出相应图书的信息。输入1行,为每次待查找的最爱图书名字。若查找成功,输出k+1行,对于每次查找,第一行是最爱图书数目,同一书名的图书可能有多本,后K行是最爱图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。若查找失败:只输出以下提示:抱歉,没有你的最爱!

void favoriteBook(LinkList Head) {           //按书名查找
	LinkList p = Head->next;
	int n = 0, tag = 0;
	char num[21];
	cout << "请输入最爱图书的书名:";
	cin >> num;
	while (p) {
		if (strcmp(p->data.name, num) == 0) {
			printf("%s%c%s%c%.2f%c", p->data.no, ' ', p->data.name, ' ', p->data.price, '\n');
			tag = 1;
			n++;
		}
		p = p->next;
	}
	if (tag == 0)
	cout << "抱歉,没有你的最爱!" << endl;
	cout<<n<<endl;
}

6.基于链式存储结构的图书信息表的最贵图书查找

读入相应的图书信息表,然后查找价格最高的图书,输出相应图书的信息。输出总计 m+1 行,其中,第 1 行是最贵的图书数目,(价格最高的图书可能有多本),后m行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

void expensiveBook(LinkList Head) {             //最贵图书的查找
	LinkList p = Head->next; 
	double maxprice = 0;             //最贵图书的价格
	while (p) {//第一次遍历找出最贵图书 
		if (p->data.price > maxprice)
		maxprice = p->data.price;
		p = p->next;
	}
	p = Head->next;
	while (p) {//第二次遍历找出和最贵图书相等的图书 
		if (p->data.price == maxprice)    //若价格与最贵价格相等则打印信息
			printf("%s%c%s%c%.2f%c", p->data.no, ' ', p->data.name, ' ',
			 p->data.price, '\n');
		p = p->next;
	}
}

7.基于链式存储结构的图书信息表的修改

读入图书信息表,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。输出总计 n+1 行,第 1 行是修改前所有图书的平均价格,后 n 行是价格修改后 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

void changepriceBook(LinkList Head) {         //图书信息表价格的修改
	LinkList p = Head->next;
	double allprice = 0;                   //平均价格
	while (p) {//第一遍遍历,得到平均价格 
		allprice += p->data.price;
		p = p->next;
	}
	allprice /= numBook(Head);
	p = Head->next;
	while (p) {//第二遍价格,价格改动 
		if (p->data.price < allprice)p->data.price *= 1.2;   //小于平均价格价格上涨20%
		else p->data.price *= 1.1;                           //大于等于平均价格上涨10%
		p = p->next;
	}
	printBook(Head);
}

1.3完整代码

#include<iostream>
#include<cstdio>
#include<cstring> 
using namespace std;
#define getpch(type) (type*)malloc(sizeof(type))
typedef struct {
	char no[8];     //书号
	char name[20];  //书名
	double price;      //价格
}Book;
//链表的定义:
typedef struct LNode{
	Book data;            //数据域
	struct LNode *next;   //指针域
}*LinkList;
int numBook(LinkList Head) {//链表长度 
	int n=0;
	LinkList temp=Head->next;
	if(temp==NULL)  return 0;
	while(temp!=NULL) {
		n++;
		temp=temp->next;
	}
	cout << "当前存有" << n << "本书" << endl;
	return n;
}
void inputBook(LinkList Head, LinkList &Rear) {     //录入图书
	LinkList temp;
	char ch;
	int n = 1;//计数用 
	while (true) {
		temp=getpch(LNode
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值