这几天在复习线性表的知识,作为数据结构的入门,算是大多数人学习完C语言接触得第一个复杂难题。那么现在,让我们来看看线性表究竟有哪些知识内容吧!
线性表:n个数据特性相同的元素构成的有限序列。
只要知道了线性表的起始位置,便可以对任意元素进行操作,每个元素间相互彼此联系
因此线性表的顺序存储结构是一种随机存取的存储结构
很容易联想到之前学习的数组,没错,可以将数组跟线性表相类比进行学习
结构特点:
- 除第一个元素之外,每一个元素均有一个前驱
- 除最后一个之外,每一个元素都有一个后继
- a1是第一个元素,a_m是最后一个元素
- 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++)
{
//遍历图书信息
......
}
}
}
以上便是线性表基本功能,其余功能可以在此基础上进行修改即可