数据结构关于链表的实践任务

发布于:2024-12-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

文章目录

  • 实验一 基于线性表的图书信息管理
    • 一、实验目的
    • 二、实验内容
      • 1. 基于顺序(链式)存储结构的图书信息表的创建和输出
      • 2.基于顺序(链式)存储结构的图书信息表的修改
      • 3.基于顺序(链式)存储结构的图书信息表的最贵图书的查找
      • 4.基于顺序(链式)存储结构的图书信息表的新图书的入库
      • 5.基于顺序(链式)存储结构的图书信息表的旧图书的出库
      • 6.基于顺序(链式)存储结构的图书信息表的图书去重(选做)
    • 三、实验提示
  • 代码

实验一 基于线性表的图书信息管理

一、实验目的

1.掌握线性表的顺序存储表示和链式存储表示。
2.掌握顺序表和链表的基本操作,包括创建、查找、插入和删除等算法。
3.明确线性表两种不同存储结构的特点及其适用场合,明确它们各自的优缺
点。

二、实验内容

选用顺序表或链表实现下述线性表的的基本操作。

1. 基于顺序(链式)存储结构的图书信息表的创建和输出

问题描述:

定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入相应的
图书数据来完成图书信息表的创建。然后,统计图书表中的图书个数,同时逐行
输出每本图书的信息。

输入要求:
输入 n+1 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1
行是输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,
价格为浮点数类型。

输出要求:
总计n+1行,第1行是所创建的图书信息表中的图书个数,后n行是n本图
书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格
分隔。其中,价格输出保留两位小数。

输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
2
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
输出样例:
6
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00

2.基于顺序(链式)存储结构的图书信息表的修改

问题描述:
首先,定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入
相应的图书数据完成图信息表的创建。然后,计算所有图书的平均价格,将所有
低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高
10%。最后,逐行输出价格修改后的图书信息。

输入要求:
输入 n+1 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1
行是输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,
价格为浮点数类型。

输出要求:
总计n+2行,第1行是修改前所有图书的平均价格,第2行是所创建的图书信
息表中的图书个数,后n行是价格修改后n本图书的信息(书号、书名、价格)、
每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位
小数。

输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0

输出样例:
25.50
6
9787302257646 程序设计基础 30.00
9787302164340 程序设计基础(第2版)24.00
9787302219972 单片机技术及应用 35.20
9787302203513 单片机原理与应用技术 28.60
9787810827430 工业计算机控制技术–原理与应用 31.90
9787811234923 汇编语言程序设计教程 25.20

3.基于顺序(链式)存储结构的图书信息表的最贵图书的查找

问题描述:
定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入相应的
图书数据来完成图书信息表的创建。然后,查找价格最高的图书,输出相应图书
的信息。

输入要求:
输入 n+1 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1
行是输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,
价格为浮点数类型。

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

输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811230710 C#程序设计易懂易会教程 32.00
0 0 0

输出样例:
2
9787302219972 单片机技术及应用32.00
9787811230710 C#程序设计易懂易会教程 32.00

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

问题描述:
首先,定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入
相应的图书数据来完成图书信息表的创建。然后,根据指定的待入库的新图书的
位置和信息,将新图书插入到图书表中指定的位置上。最后,输出新图书入库后
所有图书的信息。

输入要求:
输入 n+3 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。第n+1行是图
书输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,价
格为浮点数类型。之后输入第n+2行,内容仅为一个整数,代表待入库的新图书
的位置序号。最后,输入第n+3行,内容为新图书的信息,书号、书名、价格用
空格分隔。

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

输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机制技术原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
2
9787302265436 计算机导论实验指导 18.00
6

输出样例:
7
9787302257646 程序设计基础 25.00
9787302265436 计算机导论实验指导 18.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00

5.基于顺序(链式)存储结构的图书信息表的旧图书的出库

问题描述:
定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入相应的
图书数据来完成图书信息表的创建。然后根据指定的待出库的旧图书的位置,将
该图书从图书表中删除。最后输出该图书出库后的所有图书的信息。

输入要求:
输入 n+2 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。第n+1行是图
书输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,价
格为浮点数类型。然后,输入第 n+2 行,内容仅为一个整数,代表待删除的旧
图书的位置序号。
输出要求
若删除成功:
输出旧图书出库后所有图书的信息(书号、书名、价格),总计n行,第1行
是出库后的图书数目,后n-1行是一本图书的信息,书号、书名、价格用空格分
隔。其中,价格输出保留两位小数。
若删除失败:
只输出以下提示:抱歉,出库位置非法!

输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
2

输出样例:
5
9787302257646 程序设计基础 25.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00

6.基于顺序(链式)存储结构的图书信息表的图书去重(选做)

问题描述:
出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包
含书号重复的图书。定义一个包含图书信息(书号、书名、价格)的顺序表(链表),
读入相应的图书数据来完成图书信息表的创建(书号可能重复)。然后进行图书的
去重,即删除书号重复的图书(只保留第一本)。最后输出去重后所有图书的信息。
输入要求
输入 n+1 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1
行是输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,
价格为浮点数类型。

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

输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302257646 程序设计基础 25.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787302219972 单片机技术及应用 32.00
0 0 0

输出样例:
4
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用32.00
9787810827430 工业计算机控制技术–原理与应用 29.00

三、实验提示

不同的存储结构对应的算法实现不同,下面分别给出图书信息表的顺序存储
结构和链式存储结构的定义。
根据图书所包含的基本信息,可以对图书信息的结构体描述如下:
#define MAXSIZE 10000 //图书表可能达到的最大长度
typedef struct //图书信息定义
{
char no[20]; //图书 ISBN
char name[50]; //图书名字
float price; //图书价格
}Book;
基于上述图书信息的描述,下面分别给出图书信息表的顺序存储结构和链式
存储结构的定义。图书信息表的顺序存储结构如下:
typedef struct
{
Book *elem; //存储空间的基地址
int length; //图书表中当前图书个数
)sqlist; //图书表的顺序存储结构类型为 SqList
链式存储结构的定义如下:
typedef struct LNode
{
Book data; //结点的数据域
struct LNode *next; /结点的指针域
}LNode,*LinkList; //LinkList 为指向结构体 LNode 的指针类型

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXNUMS 20
#define MAXNAME 50

typedef struct Book  //存储单本书信息的结构体 
{
	char nums[MAXNUMS];  //书号 
	char name[MAXNAME];	 //书名
	float price;     //价格; 
}Book;

typedef struct List
{
	Book node;
	struct List *next;
}BookList;

//创建一个头结点,方便后续操作 
BookList *init()
{
	BookList *head = (BookList *)malloc(sizeof(BookList));
	head->next = NULL;
	head->node.price = 0;  //存储书的本数 
	return head;
}

//1. 基于链式存储结构的图书信息表的创建和输出
void insert(BookList **head)
{
	BookList *pr = *head;
	if(pr==NULL)
	{
		*head = init();
	}
	printf("请输入图书的信息(输入结束标志:0 0 0)\n");
	while(1)
	{
		BookList * newbook = (BookList *)malloc(sizeof(BookList));
		newbook->next = NULL;
		scanf("%s %s %f",(newbook->node).nums,(newbook->node).name,&(newbook->node).price);
		if(strcmp((newbook->node).nums,"0")==0 && strcmp((newbook->node).name,"0")==0 && (newbook->node).price == 0)
			break;
		BookList *p = *head;
		p->node.price++;  //若没有输入0 0 0,则添加书的信息,书的本数+1 
		while(p->next)    //遍历到尾节点,将尾节点的指针指向新建结点 
			p = p->next;
		p->next = newbook;
	}
} 

void print(BookList *head)
{
	BookList *p = head->next;
	printf("%.f\n",head->node.price);
	while(p)
	{
		printf("%s %s %0.2f\n",p->node.nums,p->node.name,p->node.price);
		p = p->next;
	}
}

//2.基于顺序(链式)存储结构的图书信息表的修改
void change(BookList *head)
{
	float PriceSum = 0;  //价格总和 
	BookList *p = head->next;
	int nums = (int)head->node.price; 
	while(p)
	{
		PriceSum += p->node.price;
		p = p->next;
	}
	p = head->next;
	PriceSum /= nums;
	printf("%.2f\n",PriceSum);
	while(p)
	{
		if(PriceSum > p->node.price)
			p->node.price *= 1.2;
		else if(PriceSum <= p->node.price)
			p->node.price *= 1.1;
		p = p->next;	
	}
}

// 3.基于顺序(链式)存储结构的图书信息表的最贵图书的查找
void findmax(BookList *head) 
{
	BookList *p = head->next->next;
	BookList *maxnode = head->next;
	while(p)
	{
		if(p->node.price > maxnode->node.price)
			maxnode  = p;
		p = p->next;
	}
	p = head->next;
	while(p)
	{
		if(p->node.price == maxnode->node.price)
			printf(" %s %s %0.2f\n",p->node.nums,p->node.name,p->node.price);
		p = p->next;
	}
}

// 4.基于顺序(链式)存储结构的图书信息表的新图书的入库
void enku(BookList *head)
{
	int pos;
	BookList *p = head;
	printf("输入新图书的位置序号(一个整数)\n");
	scanf("%d",&pos);
	if(pos <= 0 || pos > (int)head->node.price + 1)
	{
		printf("抱歉,入库位置非法\n");
		return;
	}
	while(--pos)
	{
		p = p->next;
	}
	head->node.price++;
	BookList *newbook = (BookList *)malloc(sizeof(BookList));
	scanf("%s %s %f",(newbook->node).nums,(newbook->node).name,&(newbook->node).price);
	newbook->next = p->next;
	p->next = newbook;
}

// 5.基于顺序(链式)存储结构的图书信息表的旧图书的出库
void delku(BookList *head)
{
	BookList *pre = head , *cur = head->next;
	int delpos;
	printf("输入删除图书的位置序号(一个整数)\n");
	scanf("%d",&delpos);
	if(delpos <= 0 || delpos > (int)head->node.price)
	{
		printf("抱歉,出库位置非法\n");
		return;
	}
	while(--delpos)
	{
		pre = cur; 
		cur = cur->next;
	}
	head->node.price--;
	BookList *tem = cur;
	pre->next = cur->next;
	free(tem);
}

// 6.基于顺序(链式)存储结构的图书信息表的图书去重(选做)
void delnode(BookList *head,BookList *del)
{
	printf("3");
	BookList *cur = head->next , *pre = head;
	while(cur != del)
	{
		pre = cur;
		cur = cur->next;
	}
	head->node.price--;
	BookList *tem = cur;
	pre->next = cur->next;
	free(tem);
	printf("4");
}

void delre(BookList *head)
{
	int i = 0;
	BookList * p = head->next,*pr = NULL;
	
	while(p)
	{
		
		pr = p->next;
		while(pr)
		{
			if(strcmp(pr->node.nums,p->node.nums) == 0)
			{
				delnode(head,pr);
			}
			pr = pr->next;	
		}
		p = p->next;
	}
}

int main()
{
	BookList *head = NULL;
	int choice = 1; 
	printf("-----------------欢迎来到图书管理系统-------------------\n");
	printf("-----------------请选择你的操作      -------------------\n");
	printf("-----------------1.创建图书信息      -------------------\n");
	printf("-----------------2.修改图书信息表    -------------------\n");
	printf("-----------------3.查找最贵图书      -------------------\n");
	printf("-----------------4.入库新图书        -------------------\n");
	printf("-----------------5.出库旧图书        -------------------\n");
	printf("-----------------6.去重图书          -------------------\n");
	printf("-----------------9.输出图书信息      -------------------\n");
	
	while(choice)
	{
		scanf("%d",&choice);
		switch(choice)
		{
			case 1:
				insert(&head);
				print(head);
				break;
			case 2:
				change(head);
				print(head);
				break;	
			case 3:
				findmax(head);
				break;
			case 4:
				enku(head);
				print(head);
				break;
			case 5:
				delku(head);
				print(head);
				break;
			case 6:
				delre(head);
				print(head);
				break;
			case 9:
				print(head);
				break; 
		}
		
	}
}