线性表链式储存(图书管理系统)

2023-11-10

      线性表链式储存和顺序储存各有优点

“该笔记的一些说法是自己的理解,并不官方”

      首先我们要创建一个结构体用来储存书籍的相关属性信息,我称为数据结构体(储存一组待储存的数据)

typedef struct book
{
	string bnum;//书的编号
	string bname;//书名
	float bprice;//书的价格
}book;//书籍结构体

 

    然后再创建一个结构体用来作为“表格”其中的成员有数据域和指针域(注意这只是一个表格)

typedef struct Node
{
	ElemType M_e;//数据域
	struct Node* next;//指针域
}Node;//表格结构体

      一个个的表格连接起来就是链表,所以链表就是一个表格指向另一个表格,一直连续不断的指下去

typedef struct Node* LinkList;//链表

 

    1. 表格定义好后我们便要初始化链表,初始化链表函数如下:

Status InitList(LinkList*L)//初始化链表(创造头结点)
{
	*L = (LinkList)malloc(sizeof(Node));//开辟空间,L是个双重指针所以这里要解引用
	if (!(*L))
		return 0;
	(*L)->next = NULL;
	return 1;
}

      初始化链表其实就是创造头结点的过程(头结点其实也就是一个表格,只是里面的数据域没有信息,只有指针域指向第一个结点)首先开辟一个表格的空间,判断是否开辟成功,开辟成功后由于此时链表还没有任何数据,所以初始化头结点指针域的指针指向空。

      2.链表初始化好以后我们便可以定义向链表输入数据的函数creatListTail,过程如下:

void creatListTail(LinkList* L)
{
	LinkList p,r;//p代表新输入数据的位置,r代表最后一个数据所在的位置
	r = (*L);//初始化r
	cout << "输入完毕按0退出" << endl;
	while (1)
	{
		p = new Node;
		/*向数据区输入数据*/
		
		cout << "请输入书的编号" << endl;
		cin >> p->M_e.bnum;
		if (p->M_e.bnum == "0")
			break;
		cout << "请输入书名" << endl;
		cin >> p->M_e.bname;
		cout << "请输入书的价格" << endl;
		cin >> p->M_e.bprice;
		r->next = p;//把p接在r的后面
		r = p;//此时p变为了最后一位,更新r为p
	}
	r->next = NULL;//r是最后一位所以指向空指针
}

      这里我们使用的是尾插法,要定义一个表格指针r来一直指向链表最后一个表格的位置,便于将用户新输入的数据连到表格的最后,一开始表格内没有数据,所以r一开始初始化为指向头结点(*L)

用p来指向开辟的一个表格(也可以说是结点)的空间,将用户输入的数据储存到开辟的这个空间中,输入完毕后将新开辟的表格p连到r的后面,此时最后一位变成了p于是让r指向此时p所在的位置,记录最后一个表格的位置(最后一个表格后面肯定没有表格了所以将r的指针域指向空)

      3.将数据输入到链表中后我们要将其输出,定义输出函数PrintdList如下:

void PrintdList(LinkList* L)//输出所有的数据
{
	LinkList p;//用来遍历的指针
	p = (*L)->next;//让p指向第一个结点
	if (p == NULL)
	{
		cout << "链表没有数据哦" << endl;
		return;
	}
	while (p)
	{
		cout << "编号:" << p->M_e.bnum << endl;
		cout << "书名:" << p->M_e.bname << endl;
		cout << "价格:" << p->M_e.bprice << endl;
		cout << endl;
		p = p->next;//打印出当前结点的数据后遍历到下一个结点
	}
}

      我们要输出所有表格的数据便要遍历所有表格,将遍历用的指针p初始化指向第一个表格后,判断第一个表格是否存在,没有存在就说明链表中没有数据。通过while循环不停的遍历并输出链表中的信息,直到指针p指向的位置没有数据为止。

      4.我们接下来还需要有查询用户输入数据的功能,查询功能的函数 GetElem如下:

void GetElem(LinkList* L)//查询用户输入的数据
{
	int a = 0;
	string name;
	string num;//定义一个临时变量来储存用户输入的数据
	LinkList p=(*L)->next;//用来遍历链表;对p初始化
	if (p == NULL)
	{
		cout << "链表没有数据哦" << endl;
		return;
	}
	cout << "1.查询书名  2.查询书籍编号" << endl;
	cin >> a;
	switch (a)
	{
	case 1:
	{
		int dbd=1;
		cout << "请输入您要查询的书名" << endl;
		cin >> name;
		do
		{
			if (p->M_e.bname == name)
			{
				dbd = 0;//找到数据退出循环
			}
			else
				p = p->next;//不是当前数据,继续向下遍历
		} while (dbd && p);
		if (dbd == 0)
		{
			cout << "编号:" << p->M_e.bnum << endl;
			cout << "书名:" << p->M_e.bname << endl;
			cout << "价格:" << p->M_e.bprice << endl;
		}
		else
			cout << "没有查到相关数据" << endl;
		
		break;
	}
	case 2:
	{
		int dbd = 1;
		cout << "请输入您要查询的书籍编号" << endl;
		cin >> num;
		do
		{
			if (p->M_e.bnum == num)
			{
				dbd = 0;//找到数据退出循环
			}
			else
				p = p->next;//不是当前数据,继续向下遍历
		} while (dbd && p);
		if (dbd == 0)
		{
			cout << "编号:" << p->M_e.bnum << endl;
			cout << "书名:" << p->M_e.bname << endl;
			cout << "价格:" << p->M_e.bprice << endl;
		}
		else
			cout << "没有查到相关数据" << endl;
		break;
	}
	}
}

      查询这里我们给了用户两种方法查询,一种通过书名查询,一种通过编号查询,两个过程差别不大,我们以查询书名为例:首先依然需要判断链表中是否有数据,避免做无用功。定义一个string类型的变量来储存用户输入的书名,在do  while循环中将找到相关数据后退出循环的功能表现为改变dbd的值能更灵活。由于退出while循环的条件有找到相关数据后退出和p指针指向空后退出(链表内的数据全部遍历完)这两种情况,所以在后面要判断是哪一种情况退出的,当dbd为0就说明是因为找到了相关数据退出的,于是便输出此时p指向的表格内的数据,dbd不为0,就说明是因为遍历完链表退出的(没有找到相关数据)

      5.接下来我们实现向链表指定位置插入数据的功能,函数ListInsert1和ListInsert2如下:

ListInsert1:

LinkList ListInsert1(LinkList* L, int i)//遍历到i-1的位置,并对一些特殊情况进行判断
{
	LinkList p;
	p = *L;
	int j = 0;//用于计数
	/*这里用while循环可以判断i值是否是合法输入,for循环就不行*/
	while (p && j < i - 1)//将p指向i-1的位置(要在i处插入i-1处必须存在结点而i处随意)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)//判断是因为什么情况退出的while循环(没有查找到i处的情况)
	{
		cout << "无法插入到" << i << "处" << endl;
		return NULL;
	}
	return p;
}

      ListInsert2:

void ListInsert2(LinkList p, ElemType e)
{
	LinkList s;
	s = new Node;//开辟新结点
	s->M_e = e;
	s->next = p->next;
	p->next = s;
	cout << "插入成功" << endl;
}

      函数ListInsert1是用于返回i-1处的位置,因为要在i处插入数据,那么i-1处就必须要有数据,所以用ListInsert1函数返回i-1的位置并且可以判断i-1处是否有数据,要是没有数据便说明无法插入,可以直接退出程序避免多余的操作。

      要是ListInsert1成功返回i-1处的位置,我们便可以向程序输入数据,并调用ListInsert2函数将数据输入链表

      6.接下来我们实现删除链表指定位置数据的功能,函数DeleteList1和DeleteList2如下:

DeleteList1:

LinkList DeleteList1(LinkList* L, int i)//遍历到i-1的位置,并对一些特殊情况进行判断
{
	int j = 0;//用于计数
	LinkList p;//用p来遍历到i处
	p = *L;
	while (p->next && j < i - 1)//遍历将p指向i-1处
	{
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i - 1)//离开while循环p却没有指向i-1处的情况
	{
		cout << "无法删除" << i << "处的书籍" << endl;
		return NULL;
	}
	
	return p;//此时p指向i-1处的位置
}

DeleteList2:

void DeleteList2(LinkList p)//删除链表i处的数据
{
	LinkList q;
	q = p->next;//记录即将删除的结点的地址便于一会释放
	cout << "您删除的书籍为:" <<q->M_e.bname<< endl;
	p->next = q->next;
	free(q);

}

      我们这里的DeleteList1和查询函数ListInsert1差别不大,都是返回i-1处的位置,虽然乍一看i-1处的数据存在与否和删除i处的数据没有太大关系,但p要指向i-1处的位置才好进行链表删除操作时指针域数据的改变。

      7.接下来我们实现清空链表的功能,函数ClearList如下:

Status ClearList(LinkList* L)
{
	LinkList p, q;
	p = (*L)->next;
	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	(*L)->next = NULL;
	cout << "链表已清空" << endl;
	return 1;
}

      用两个表格指针交替遍历便可以清空链表

接下来便是所有代码展示:

头文件FUNC.h

#pragma once
#include <iostream>
#include<string>
using namespace std;


typedef int Status;//Status代表函数类型,这里暂设定为int


typedef struct book
{
	string bnum;//书的编号
	string bname;//书名
	float bprice;//书的价格
}book;//书籍结构体


typedef book ElemType;


typedef struct Node
{
	ElemType M_e;//数据域
	struct Node* next;//指针域
}Node;//表格结构体
typedef struct Node* LinkList;//链表


Status InitList(LinkList*L);//初始化链表


Status ClearList(LinkList* L);//清空链表


void creatListTail(LinkList* L);//向链表输入数据


void PrintdList(LinkList* L);//输出所有的数据


void GetElem(LinkList* L);//查询用户输入数据的信息


LinkList ListInsert1(LinkList* L, int i);//在链表的i处插入数据
void ListInsert2(LinkList p, ElemType e);


LinkList DeleteList1(LinkList* L, int i);//删除链表i处的数据
void DeleteList2(LinkList p);

源文件FUNC.cpp

#include "FUNC.h"


Status InitList(LinkList*L)//初始化链表(创造头结点)
{
	*L = (LinkList)malloc(sizeof(Node));//开辟空间,L是个双重指针所以这里要解引用
	if (!(*L))
		return 0;
	(*L)->next = NULL;
	return 1;
}


/* 初始条件:链式线性表L已存在。操作结果:将L重置为空表 */
Status ClearList(LinkList* L)
{
	LinkList p, q;
	p = (*L)->next;
	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	(*L)->next = NULL;
	cout << "链表已清空" << endl;
	return 1;
}


/*向链表输入数据*/
void creatListTail(LinkList* L)
{
	LinkList p,r;//p代表新输入数据的位置,r代表最后一个数据所在的位置
	r = (*L);//初始化r
	cout << "输入完毕按0退出" << endl;
	while (1)
	{
		p = new Node;
		/*向数据区输入数据*/
		
		cout << "请输入书的编号" << endl;
		cin >> p->M_e.bnum;
		if (p->M_e.bnum == "0")
			break;
		cout << "请输入书名" << endl;
		cin >> p->M_e.bname;
		cout << "请输入书的价格" << endl;
		cin >> p->M_e.bprice;
		r->next = p;//把p接在r的后面
		r = p;//此时p变为了最后一位,更新r为p
	}
	r->next = NULL;//r是最后一位所以指向空指针
}


void PrintdList(LinkList* L)//输出所有的数据
{
	LinkList p;//用来遍历的指针
	p = (*L)->next;//让p指向第一个结点
	if (p == NULL)
	{
		cout << "链表没有数据哦" << endl;
		return;
	}
	while (p)
	{
		cout << "编号:" << p->M_e.bnum << endl;
		cout << "书名:" << p->M_e.bname << endl;
		cout << "价格:" << p->M_e.bprice << endl;
		cout << endl;
		p = p->next;//打印出当前结点的数据后遍历到下一个结点
	}
}


void GetElem(LinkList* L)//查询用户输入的数据
{
	int a = 0;
	string name;
	string num;//定义一个临时变量来储存用户输入的数据
	LinkList p=(*L)->next;//用来遍历链表;对p初始化
	if (p == NULL)
	{
		cout << "链表没有数据哦" << endl;
		return;
	}
	cout << "1.查询书名  2.查询书籍编号" << endl;
	cin >> a;
	switch (a)
	{
	case 1:
	{
		int dbd=1;
		cout << "请输入您要查询的书名" << endl;
		cin >> name;
		do
		{
			if (p->M_e.bname == name)
			{
				dbd = 0;//找到数据退出循环
			}
			else
				p = p->next;//不是当前数据,继续向下遍历
		} while (dbd && p);
		if (dbd == 0)
		{
			cout << "编号:" << p->M_e.bnum << endl;
			cout << "书名:" << p->M_e.bname << endl;
			cout << "价格:" << p->M_e.bprice << endl;
		}
		else
			cout << "没有查到相关数据" << endl;
		
		break;
	}
	case 2:
	{
		int dbd = 1;
		cout << "请输入您要查询的书籍编号" << endl;
		cin >> num;
		do
		{
			if (p->M_e.bnum == num)
			{
				dbd = 0;//找到数据退出循环
			}
			else
				p = p->next;//不是当前数据,继续向下遍历
		} while (dbd && p);
		if (dbd == 0)
		{
			cout << "编号:" << p->M_e.bnum << endl;
			cout << "书名:" << p->M_e.bname << endl;
			cout << "价格:" << p->M_e.bprice << endl;
		}
		else
			cout << "没有查到相关数据" << endl;
		break;
	}
	}
}


/*在链表的i处插入数据*/
LinkList ListInsert1(LinkList* L, int i)//遍历到i-1的位置,并对一些特殊情况进行判断
{
	LinkList p;
	p = *L;
	int j = 0;//用于计数
	/*这里用while循环可以判断i值是否是合法输入,for循环就不行*/
	while (p && j < i - 1)//将p指向i-1的位置(要在i处插入i-1处必须存在结点而i处随意)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)//判断是因为什么情况退出的while循环(没有查找到i处的情况)
	{
		cout << "无法插入到" << i << "处" << endl;
		return NULL;
	}
	return p;
}
void ListInsert2(LinkList p, ElemType e)
{
	LinkList s;
	s = new Node;//开辟新结点
	s->M_e = e;
	s->next = p->next;
	p->next = s;
	cout << "插入成功" << endl;
}


/*删除链表i处的数据*/
LinkList DeleteList1(LinkList* L, int i)//遍历到i-1的位置,并对一些特殊情况进行判断
{
	int j = 0;//用于计数
	LinkList p;//用p来遍历到i处
	p = *L;
	while (p->next && j < i - 1)//遍历将p指向i-1处
	{
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i - 1)//离开while循环p却没有指向i-1处的情况
	{
		cout << "无法删除" << i << "处的书籍" << endl;
		return NULL;
	}
	
	return p;//此时p指向i-1处的位置
}
void DeleteList2(LinkList p)//删除链表i处的数据
{
	LinkList q;
	q = p->next;//记录即将删除的结点的地址便于一会释放
	cout << "您删除的书籍为:" <<q->M_e.bname<< endl;
	p->next = q->next;
	free(q);

}
	

源文件text.cpp

#include "FUNC.h"
int main()
{
	cout << "欢迎来到图书馆管理系统(链式储存)" << endl;
	int b1 = 0;
	LinkList L;//定义一个数据表L出来
	if (!InitList(&L))//用了Initlist函数已经初始化链表
		cout << "链表创建失败" << endl;
	int APS = 1;
	while (APS)//用APS方便后面退出while循环
	{
		system("pause");
		system("cls");
		cout << "       请选择您要进行的操作" << endl;
		cout << "1.存储书籍,2.输出所有书籍  3.查询书籍  4.插入书籍  5.删除书籍  6.退出程序  7.删除所有书籍" << endl;
		cin >> b1;
		switch (b1)
		{
		case 1:
		{
			creatListTail(&L);
			break;
		}
		case 2:
		{
			PrintdList(&L);
			break;
		}
		case 3:
		{
			GetElem(&L);
			break;
		}
		case 4:
		{
			ElemType e;//用一个临时变量储存用户输入的数据
			LinkList p;//用临时变量储存函数ListInsert1的返回值
			int i;
			cout << "请输入在哪里插入书籍" << endl;
			cin >> i;
			p = ListInsert1(&L, i);
			if (p)
			{
				cout << "请输入书籍编号" << endl;
				cin >> e.bnum;
				cout << "请输入书名" << endl;
				cin >> e.bname;
				cout << "请输入价格" << endl;
				cin >> e.bprice;
				ListInsert2(p, e);//用ListInsert2函数将数据输入链表

			}
			break;
		}
		case 5:
		{
			LinkList p;//用来接收函数DeleteList1返回的指针
			ElemType e;//用来储存删除的数据
			int i;
			int verify;//用于确认是否删除数据
			cout << "要删除哪个位置的数据" << endl;
			cin >> i;
			p=DeleteList1(&L, i);
			cout << "要删除的书籍为:" << p->next->M_e.bname << endl;//p指向的是i-1处的数据而不是i处的,所以要用 p->next->M_e.bname来输出i处的书名
			cout << "是否确认删除:1.是  2.否" << endl;
			cin >> verify;
			if (verify == 1)
			{
				DeleteList2(p);
			}
			else if (verify == 2)
			{
				cout << "取消删除" << endl;
			}
			else
				cout << "非法输入" << endl;
			break;
		}

		case 6:
		{
			cout << "感谢使用" << endl;
			APS = 0;
			break;
		}
		case 7:
		{
			int verify;
			cout << "是否要清空链表:1.是  2.否" << endl;
			cin >> verify;
			if (verify == 1)
			{
				ClearList(&L);
			}
			else if (verify == 2)
			{
				cout << "取消清空" << endl;
			}
			else
				cout << "非法输入" << endl;
			break;
		}
		default:
		{
			cout << "该输入不合法" << endl;
			break;
		}
		}
	}
	return 0;
}

     线性表链式储存完成。

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

线性表链式储存(图书管理系统) 的相关文章

  • dao层代码

    dao层 数据接口层 方法层 介于业务逻辑层和数据库之间 进行数据的访问和操作 在实际业务处理过程中 往往需要进行多次数据库的访问 这些访问性质往往是相同的 采用Dao层可以将对数据库访问进行封装 避免经行重复性数据库访问开发操作 同时降低
  • 数据挖掘-为什么进行数据挖掘

    为什么进行数据挖掘 1 进入信息时代 信息时代数据量暴增 社会计算机化和功能强大的数据收集和存储工具导致数据的爆炸式增长 数据的爆炸式增长 广泛可用和巨大数量使得当前时代成为真正的数据时代 急需功能强大和通用的工具 以便从这些海量数据中发现
  • matlab运动背景位移矢量,[Matlab科学绘图] 绘制平面位移云图

    Matlab科学绘图 绘制平面位移云图 Matlab科学绘图 绘制平面位移云图 在用MATLAB做有限元分析的时候 难免需要绘制云图 网上的资料又很少 且不通用 自己实现之后在此记录一下 希望也能帮助到其他人 平台 Win7 Matlab

随机推荐

  • 《雷达系统设计MATLAB仿真》学习

    文章目录 第一章 雷达分类 按频段分类 按波形分类 按用途分类 监视雷达 跟踪雷达 第四章 模糊函数 模糊函数的几点应用 目标分辨情况 测量精度 模糊情况 杂波抑制能力 输出功率波形 第六章 杂波 擦地角 掠射角 下俯角 入射角 海杂波 地
  • 上拉和下拉电阻 [附:OC门与OD门]

    上拉就是通过一个电阻将芯片的一个引脚或线路中的一点接电源正极 Vcc 将该处电平拉向高电平 下拉就是通过一个电阻将芯片的引脚或线路中的一点接地 将该处电平拉向低电平 其主要目的是在电路驱动器关闭时给引脚或线路节点一个固定的默认的电平 上拉电
  • IOS开发笔记 - 调试技巧之自定义宏输出

    这个小技巧是在翻阅别人的代码时候发现的 由于以前学过C 所以知道这里应该是一个神奇的宏把 按alt点进去果然是酱紫 这里是当再DEBUG模式下 调用这个LogMethod的宏时会输出所在方法的方法名及所在行数 运行如下 有了这个宏 调试是不
  • vue中实现在子组件中刷新父组件

    一 首先是父组件 现在父组件中的子组件属性上添加监听事件 signStatusVerdict 二 其次是子组件 发射一个事件给父组件的监听属性 三 最后是父组件 父组件中监听到事件后会执行listenSignStatus方法 执行更新父组件
  • 【数字IC设计】亚稳态与多时钟切换

    数字IC设计 亚稳态与多时钟切换 1 亚稳态的产生与传输 1 1 CMOS反相器的电平传输特性曲线 2 亚稳态的恢复时间与平均无故障时间 3 减小亚稳态的建议 4 多时钟切换电路 本次是与触发器有关的亚稳态以及多时钟系统中的时钟切换问题讲解
  • 【论文】 各高校的毕业论文的Latex模板链接

    title 南京航空航天大学毕业论文 LaTeX 模板 postname date 2018 12 27 23 41 url http www latexstudio net archives 51558 html source 原始链接
  • 文献管理软件Mendeley的优缺点以及下载安装

    文献管理软件Mendeley Mendeley的简介 优点 缺点 Mendeley下载安装 Mendeley的简介 许多科研人员都知道 目前主流的文献管理软件老大哥是Endnote 但是如果你的学校或者科研机构没有购买这个软件的话 你是用不
  • mmocr dataset训练集可视化

    1 可视化效果 这里以dbnet网络训练 icdar2015数据集为例 from mmcv import Config imdenormalize from mmocr datasets import build dataset if na
  • 【python数据挖掘课程】二十五.Matplotlib绘制带主题及聚类类标的散点图

    这是 Python数据挖掘课程 系列文章 希望对您有所 帮助 当我们做聚类分析绘制散点图时 通常会遇到无法区分散点类标的情况 做主题分析时 可能会遇到无法将对应散点的名称 尤其中文名称 添加至图型中 为了解决这两个问题 本文提出了Matpl
  • PowerBI基础——第一天 度量值、新建列及关系函数 多对一及一对多匹配

    简体中文版的PowerBI官网 https powerbi microsoft com zh cn 在Analysis Services Power BI 以及 Excel 中的 Power Pivot中使用的公式表达语言叫做数据分析表达式
  • Fiddler过滤器 Filters 详解

    目录 前言 一 Hosts 过滤 较常用 二 Client Process 过滤 客户端进程过滤 通过配置只过滤 不过滤哪些进程的请求 用的不多 三 Request Headers 根据请求头信息进行过滤 常用 四 Breakpionts
  • 查看磁盘io

    yum y install sysstat 执行 iostat x 1 10 一般 util大于70 I O压力就开始出现了 如果 util越接近100 表明I O压力越大 rrqm s 每秒进行merge的读操作数目 即delta rme
  • element中手动图片上传,附带完整代码

    先展示一张图片效果图片 这种上传时 很常见的 之所以写这篇文章的目的时记录一下 和之前完全不同的上传方式 之前的上传方式 由于
  • 2023华为OD机试Java【报数问题】

    题目 最开始的时候 有100个同学 每个同学都有一个编号 从一到一百 所有的人围城一圈 报数的规则是 从 1 开始报数 如果某个报数为 M 那么他就退出游戏 他的下一个人从 1 重新开始报数 如果最后的人数小于M 则停止游戏 请你计算最后剩
  • 分类、目标检测、语义分割、实例分割的区别

    计算机视觉的任务很多 有图像分类 目标检测 语义分割 实例分割和全景分割等 那它们的区别是什么呢 1 Image Classification 图像分类 图像分类 下图左 就是对图像判断出所属的分类 比如在学习分类中数据集有人 person
  • Redis压力测试——redis-benchmark

    1 redis benchmark简介 redis benchmark是官方自带的Redis性能测试工具 用来测试Redis在当前环境下的读写性能 在使用Redis的时候 服务器的硬件配置 网络状况 测试环境都会对Redis的性能有所影响
  • MATLAB矩阵的值,迹,秩,范数,上三角矩阵,下三角矩阵,主对角线元素

    设A为矩阵 det A 求矩阵的值 trace A 求矩阵的迹 rank A 求矩阵的秩 norm A 求矩阵的范数 norm A 1 求矩阵的1范数 norm A inf 求矩阵的无穷范数 diag A 求主对角线元素 diag详细用法
  • java中获取泛型参数详解【全网最详细】

    java中所有的类型都继承自Type其中包括Class类也是继承自它 另外它还有四个重要的子类 ParameterizedType表示是个带泛型的类型 如List
  • android 触摸屏校准软件,触摸屏软件(eGalaxTouch)下载_触摸屏软件(eGalaxTouch)官方下载-太平洋下载中心...

    eGalaxTouch是一款电子触摸屏驱动程序 电子触摸屏幕有时候是需要校准一下才能准确获取坐标点 这款软件可以帮助我们校准触摸屏参数 推荐有需要的用户下载使用 校准方法 1 下载 安装eGalaxTouch Android板子连接液晶屏
  • 线性表链式储存(图书管理系统)

    线性表链式储存和顺序储存各有优点 该笔记的一些说法是自己的理解 并不官方 首先我们要创建一个结构体用来储存书籍的相关属性信息 我称为数据结构体 储存一组待储存的数据 typedef struct book string bnum 书的编号