线性表 数据结构

这几天在复习线性表的知识,作为数据结构的入门,算是大多数人学习完C语言接触得第一个复杂难题。那么现在,让我们来看看线性表究竟有哪些知识内容吧!

线性表:n个数据特性相同的元素构成的有限序列。

只要知道了线性表的起始位置,便可以对任意元素进行操作,每个元素间相互彼此联系

因此线性表的顺序存储结构是一种随机存取的存储结构 

很容易联想到之前学习的数组,没错,可以将数组跟线性表相类比进行学习

结构特点:

  1. 除第一个元素之外,每一个元素均有一个前驱
  2. 除最后一个之外,每一个元素都有一个后继 
  3. a1是第一个元素,a_m是最后一个元素
  4. a_n-1是a_n的前继,a_n+1是a_n的后继

用途:线性表可以用于存储一些有顺序规律的事件,如学生可以依托线性表来编写简易的图书管理系统、学生个人信息及其考试成绩系统等等,利用线性表可以对这些信息进行有效的存储、信息比较等操作。

线性表的存储位置是连续的

线性表中第i+1个数据元素的存储位置和第i个元素的存储位置满足:

LOC(a_i+1)=LOC(a_i)+L;//L为线性表中每个元素所占用的存储单元 

下面便开始线性表的学习

比如:
typedef int Elemtype;

typedef struct 
{
    char student_name[20];
    int age;
    float score;
    char student_num[20];
    ......
}Stu,*pStu;
这个便是初始的准备,其中我构建了一个结构体用于存储学生的年龄,分数,学号以及姓名这些信息来为后续工作做好准备。

紧接着我们要对接下来的操作有一定的了解,举一个简单的例子

我在线性表中存储了一定顺序排放的数字,这时我可以对其进行下面操作:

initList(&L);//初始化一个线性表,为存储有序数字做好准备

is_emptyList(&L);//判断线性表是否为空

traverseList(&L);//对线性表中所存储的元素进行按顺序依次遍历

indexList(&L,e);//在线性表中查找特定的元素

等等一些操作,会在实操中一一用代码表示出来

 下面便是具体函数的代码表示

首先我们做好准备工作
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 20//表示线性表所能存储的最大容量

typedef struct//结构体表示图书的基本信息
{
    char name[20];
    float price;
}Book;

typedef struct
{
    Book * elem;//存储图书信息的线性表的首地址
    int length;//线性表中所存储的数据个数;
}SqList;

int main()
{
    SqList L;//开始构建线性表
    ......
}

    

第一步是为线性表分配空间去存储数据
 

void initList(SqList *L)
{
	L->elem=new SqList(MAXSIZE);//表示向系统请求MAXSZIE的空间大小给数组elem
	if(!L->elem)//判断是否为elem数组分配空间
	{
		exit(-1);
		printf("内存分配失败!\n");
	}
	L->length=0;//初始存储数据个数为0
}

接着我们试着向其中增加元素

void getElemList(SqList *L)//存储所有图书信息
{
	int num;
	printf("请输入要存储图书的本数:");
	scanf("%d",&num);
	for(int i=0;i<num;i++)
	{
		printf("请输入第%d图书信息:\n",i+1);
		gets(L->elem[i].name);//图书名称
		scanf("%f",&L->elem[i].price);//图书单价
        L->length++;//存储图书增加一本
	}
}

 接着便开始我们的函数操作了

比如说,我们要图书管理系统中第3本图书的所有信息,这时候我们可以查找图书信息

bool getelemList(SqList *L,int loc)
{
	if(loc<1||loc>MAXSIZE)//判断要查找图书位置的合法性
		return false;
	printf("图书名称是%s",L->elem[loc-1].name);
	printf("图书单价是%f",L->elem[loc-1].price);
	return true;
}

我们也可以按照图书名称进行查找,来判断是否有该图书名称

bool findelemList(SqList *L,char *name)//name为待查找图书的名称
{
	for(int i=0;i<L->length;i++)
	{
		if(strcmp(L->elem[i].name,name))//判断图书名称是否存在
			return true;
	}
	return false;
}

我们也可以在线性表中插入新元素信息

bool insertList(SqList *L,int loc,char *tem_name,float tem_price)
{
	if(loc<1||loc>MAXSIZE)
		return false;
	if(L->length==MAXSIZE)
		return false;//判断线性表是否已满
	for(int i=L->length-1;i>loc-1;i--)//将loc-1之后的元素依次后移为新增如元素挪位
	{
		strcpy(L->elem[i+1].name,L->elem[i].name);//信息全部后移
		L->elem[i+1].price=L->elem[i].price;
	}
	//此时loc-1的位置为新增元素空了出来
	strcpy(L->elem[loc-1].name,tem_name);//新增图书名称加入
	L->elem[loc-1].price=tem_price;
    L->length++;//图书本数加一
	return true;
}

 删除图书信息

bool deleteList(SqList *L,int loc,char * tem_name,float * tem_price)
{
	if(loc<1||loc>MAXSIZE)
		return false;
	strcpy(tem_name,L->elem[loc-1].name);//保存被删除图书的信息
	*tem_price=L->elem[loc-1].price;
	for(int i=loc-1;i<L->length;i++)
	{
		strcpy(L->elem[i].name,L->elem[i+1].name);//图书信息前移
		L->elem[i].price=L->elem[i+1].price;
	}
	L->length--;//图书总数减少一本
}

判断图书数字

int numList(SqList *L)
{
	return L->length;
}

遍历所有图书信息

bool traverseList(SqList *L)
{
	if(!L->length)
	{
		for(int i=0;i<L->length;i++)
		{
			//遍历图书信息
			......
		}
	}
}

以上便是线性表基本功能,其余功能可以在此基础上进行修改即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值