【顺序表图书管理】

2023-11-19

一、实验目的

掌握顺序存储的线性表的创建、查找、插入、删除和输出操作

二、实验内容

实现一个存放图书信息的顺序表

三、实验要求

  1. 图书的基本信息有图书编号(例如:1,2,3,4等),书名和价格等。
  2. 对图书的顺序表进行查找、插入、删除和输出操作。

(3)选做实验:把图书顺序表中的信息存储到文本文件,并且可以把文本文件中的图书信息存储到图书顺序表中

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

#define LIST_INIT_SIZE 100	//顺序表可能达到的最大长度100

typedef struct				//书的结构体
{
	char no[20];			//书的编号
	char name[50];			//书名
	float price;			//书的价格
}Book;

void BookCreate(Book *bk, char no[], char name[], float price)			//创建一本书
{
	strcpy(bk->no,no);
	strcpy(bk->name, name);
	bk->price = price;
}

void BookPrint(Book bk)													//输出书的信息
{
	printf(bk.no);
	printf("\t");
	printf(bk.name);
	printf("\t");
	printf("%f",bk.price);
	printf("\n");
}

typedef struct				//顺序表
{
	Book *elem;				//存储空间的基地址
	int length;				//图书表中书的个数
}SqList;

int InitList(SqList *L) //初始化顺序表
{
	L->elem = malloc(LIST_INIT_SIZE*sizeof(Book));
	if(!L->elem)
	{
		printf("error initlist");
		exit(1);	
		return 0;
	}
	L->length = 0;
	return 1;
}

int ListPrint(SqList L)			//输出顺序表中所有元素
{
	int i = 0;
	printf("The length of the list:%d\n",L.length);
	printf("Books are: \n");
	for(i=0;i<L.length;i++)
	{
		BookPrint(L.elem[i]);
	}
	printf("\n");
}

int ListInsert(SqList *L, int i, Book el)		//在顺序表中插入元素
{
	int location=i;
	if(location>L->length+1||location<1)
	{
		return 0;
	}
	if(location>LIST_INIT_SIZE)
	{
		return 0;
	}
	for(i=L->length-1;location-1<=i;i--)
	{
		L->elem[i+1]=L->elem[i];
	}
	L->elem[location-1]=el;
	L->length++;
	return 1;
}

int ListDelete(SqList *L, int i)				//删除第i个位置的元素
{
	int location=i;
	if(location>L->length+1||location<1)
	{
		return 0;
	}
	if(location>LIST_INIT_SIZE)
	{
		return 0;
	}
	for(;i<L->length;i++)
	{
		L->elem[i-1]=L->elem[i];
	}
	L->length--;
	return 1;
}

int LocateElem(SqList L, char no[]) 			//在顺序表中找到编号为no的书的位置
{
	int i=0;
	for(i=1;i<=L.length;i++)
	{
		if(strcmp(L.elem[i-1].no,no)==0)
		{
			printf("LocateElem are:\n");
			BookPrint(L.elem[i-1]);
			printf("\n");
			return i-1;
		}
		else
		{
			return;
		}
	}
}

int ModifyList(SqList *L, char newname[], char no[])		//把顺序表中编号为no的书名改成newname
{
	strcpy(L->elem[LocateElem(*L,no)].name,newname);
	return 1;
}

int main(void)
{
	Book bk1,bk2;
	SqList L;
	BookCreate(&bk1,"NO00001","Data struct and algorithm",45.00);
	BookCreate(&bk2,"NO00002","Data Minning",72.00);
	BookPrint(bk1);
	BookPrint(bk2);
	InitList(&L);
	ListInsert(&L, 1, bk1);
	ListInsert(&L, 2, bk2);
	ListInsert(&L, 4, bk2);
	ListPrint(L);
	ListDelete(&L,1);
	ListDelete(&L,6);
	ListPrint(L);
	LocateElem(L,"NO00002");
	LocateElem(L,"NO00003");
	ModifyList(&L,"AI","NO00002");
	ListPrint(L);
	system("pause");
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【顺序表图书管理】 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐