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

文章目录

  • 实验一 基于线性表的图书信息管理
    • 一、实验目的
    • 二、实验内容
        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 的指针类型

代码

c 复制代码
#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; 
		}
		
	}
}
相关推荐
Cooloooo20 分钟前
最大堆【东北大学oj数据结构9-2】C++
java·数据结构·c++
leing1232 小时前
125. 耍杂技的牛 acwing 贪心算法
数据结构·算法·贪心算法
7yewh2 小时前
LeetCode 力扣 热题 100道(二十一)接雨水(C++)
开发语言·数据结构·c++·算法·leetcode·安卓
c++初学者ABC3 小时前
统计字符的个数C++
开发语言·数据结构·c++
醉颜凉3 小时前
【一本通】两个数的最小公倍数
c语言·数据结构·c++·算法
weisian1513 小时前
Redis篇-11--数据结构篇3--字符串内存模型(简单动态字符串SDS)
数据结构·数据库·redis
7yewh4 小时前
LeetCode 力扣 热题 100道(二十)三数之和(C++)
c语言·数据结构·c++·算法·leetcode
代码雕刻家4 小时前
2.12.顺序表和链表的比较
数据结构·链表·顺序表
FranYeCisco6 小时前
C++基础:操作符
数据结构·c++·算法