C语言——图书结构体数组实现以及简单操作

导言:本文使用C语言构建图书结构体,并实现其创建、输出、新旧书入库出库、最贵图书查找、图书修改、排序、逆序存储以及数组图书去重等函数的实现。

一、图书结构体定义

为了方便数组操作的实现,初始化图书数组1000个,根据用户需要的大小进行图书的初始化。

#include<stdio.h>
#include<stdlib.h>
#define N 1000  //图书数组可能达到的最大长度 
typedef struct tagbook
{
	char num[20];//图书ISBN
	char name[50];//图书名字
	double price;//图书价格
}Book;

二、图书结构体数组的创建和输出

本函数的输入n+1行,第一行是需要输入图书的个数n,其中后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号和书名为字符串类型,价格为浮点数类型。

/*创建、输出函数接口定义*/
void input(Book book[],int n);
void output(Book book[],int n);

input函数使用scanf对图书结构的三个信息元素进行录入。在这里要注意的是,编译环境为Visual Studio 2017中,scanf是无法通过代码检测的,需要换成C++中的cin(标准输入输出流)进行录入,没有其他办法(亲测gets函数、fgets函数、scaf_s函数均无法实现空格读取字符串)。

/*input函数定义*/
void input(Book book[], int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		scanf("%s %s %lf", book[i].num, book[i].name, &(book[i].price));
	}
}
/*output函数定义*/
void output(Book book[], int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		printf("%s %s %.2lf", book[i].num, book[i].name, book[i].price);
		if (i != n - 1)
			printf("\n");
	}
}

三、图书结构体数组的新书入库及旧书出库

/*图书插入函数接口定义*/
void insert(Book *L,int *m,int index,Book book);
//其中 L , m, index , book都是用户传入的参数。 L 是指向要操作的图书数组的指针; m 是指向图书总数的指针;index是插入的位置;book是待插入的一本图书信息。
void del(Book *L,int *m,int index);//在指定位置删除一个学生并显示所有学生信息
//其中 L, m和index是用户传入的参数。 L 是待操作的图书信息,m 是指向学生的总人数的指针,index是旧书删除的位置。
/*insert函数定义*/
void insert(Book *L, int *m, int index, Book book)
{
	Book temp;
	int size_bookarray;
	int move_size;
	int i, j;
	size_bookarray = *m;
	if (index > (*m) + 1 || index <= 0)
	{
		printf("Sorry,the position to be inserted is invalid!");
	}
	else
	{
		move_size = size_bookarray - index + 1;
		for (i = size_bookarray - 1; i >= size_bookarray - move_size; i--)
		{
			L[i + 1] = L[i];
		}
		L[index - 1] = book;
		*m = size_bookarray + 1; // 修改图书结构体数组图书总数
	}
}
/*del函数定义*/
void del(Book *L, int *m, int index)
{
	int i;
	int size_bookarray;
	int move_size;
	size_bookarray = *m;
	if (index > size_bookarray || index <= 0)
	{
		printf("Sorry,the position to be deleted is invalid!");
	}
	else
	{
		move_size = size_bookarray - index;
		for (i = index - 1; i < index - 1 + move_size; i++)
		{
			L[i] = L[i + 1];
		}
		*m = size_bookarray - 1;
	}
}

四、最贵图书查找

/*函数接口定义*/
void MaxPrice(Book *L,int n); 

/*MaxPrice函数定义*/
void MaxPrice(Book *L, int n)
{
	int i;
	int count = 0;
	double max_price = 0;
	for (i = 0; i < n; i++)
	{
		if (max_price <= L[i].price)//找最高价格
			max_price = L[i].price;
	}
	//在找到最高价格的基础上进行检索,找出下标
	for (i = 0; i < n; i++)
	{
		if (L[i].price == max_price)
			count++;
	}
	printf("%d\n", count);
	for (i = 0; i < n; i++)
	{
		if (L[i].price == max_price)
		{
			printf("%s %s %.2lf\n", L[i].num, L[i].name, L[i].price);
			count--;
		}
	}
}

五、图书按照价格降序排序

该函数要求使用稳定排序方法,在这里考虑采用冒泡排序法:

/*函数接口定义*/
Book* Sort(Book *L,int n);

/*Sort函数定义*/
Book* Sort(Book *L, int n)
{
	int i, j;
	int m = n - 1;
	int flag = 1;
	Book temp;
	while ((m>0)&&(flag == 1))
	{
		flag = 0;
		for (j = 0; j < m; j++)
		{
			if (L[j].price < L[j + 1].price)
			{
				flag = 1;
				temp = L[j];
				L[j] = L[j + 1];
				L[j + 1] = temp;
			}
		}
		--m;
	}
        return L;
}

六、图书结构数组的去重操作

出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。定义一个包含图书信息(书号、书名、价格)的结构体数组,读入相应的图书数据来完成图书信息的创建(书号可能重复),然后进行图书的去重,即删除书号重复的图书(只保留第一本),最后输出去重后所有图书的信息。要求编写图书去重的函数。

/*函数接口定义*/
void del_same(Book *L,int *m);

/*del_same函数定义*/
//该函数的实现离不开使用del函数(对应位置删除函数)
void del_same(Book *L, int *m) 
{
	int i, j;
	int size_bookarray;
	size_bookarray = *m;
	for (i = 0; i < size_bookarray; i++)
	{
		for (j = i + 1; j < size_bookarray; j++)
		{
			if (strcmp(L[i].num, L[j].num) == 0)//如果相等 有重复
			{
				del(L, &size_bookarray, j + 1);
				//同时修改了数组大小
				j = j - 1; //这一步是为了防止j的跳跃,否则会出现比较遗漏的情况
			}	
		}
	}
	//*m = size_bookarray;
}

 

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值