一。什么是线性表?
定义:在数据元素的非空有限集中,(1)存在唯一的一个被“第一个”的数据元素;(2)存在唯一一个被称为“最后一个”的数据元素;(3)除第一个元素外,每个元素都有一个唯一的前驱;(4)除最后一个元素外,每个元素都有一个唯一的前驱。
简单来说就是一条直线型的数据结构:
。——。——。——。——。
每个节点都是一个数据元素,可以是一个变量,也可以是一个结构体,但是他们之间存在直线型的关系。
线性表其实是一种数据结构集合,这种数据结构集合包含了许多以线性的数据结构,列入顺序表,链表,队列,堆栈等;现在我们只拿顺序表来实现。
二。线性表的顺序表示和实现
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
1.首先,我们要理清思路。第一步就是定义一个结构体单元,这个结构体单元里要包含我们的数据元素的地址,这样我们就可以根据连续的数据元素地址进行插入以及删除数据操作。其次就是要有一个当前分配的内存容量,当我们的结构体里面的数据元素地址用满时,我们就可以利用它进行判断,从而再增加内存。最后一个就是当前的长度,记录有多少个数据元素,使我们可以对数据元素的操作更加方便。
//------------------线性表的动态分配顺序结构---------------------------
#define LIST_INIT_SIZE 100//初始化时线性表结构体的内存大小
#define LISTINCREMENT 10//线性表的分配内存增量
struct SqList
{
ElemType *elem;//数据元素,可以是变量,也可以式结构体
int lenght;//数据元素所占的内存大小
int listsize;//当前分配的存储容量
}
2,。其次就是操作。这些操作包括线性表的初始化,以及插入数据,修改数据,删除数据。
(1)线性表初始化其实就是先初始化一个结构体,赋给它一定的内存容量,记录长度,以及当前容量。它包含了所有的的数据元素,而且数据元素都是动态增加的。
//------------------线性表的初始化------------------------
bool InitList_Sq(SqList &L)
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//给数据元素集分配内存空间,它包含了所有的数据元素
if(!L.elem)//如果分配失败
return false;
L.length=0;//当前长度是0
L.listsize=LIST_INIT_SIZE;//当前分配容量是100
}
(2)。线性表的插入操作
当在数据元素集合第n个之前插入一个元素时,要把第n个以及之后的那些数据元素位置往后移,从而将第n个元素的位置空出来,将第n个元素的地址内赋予所插入元素值。
//------------------------线性表的插入------------------------
bool ListInsert_Sq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length-1)
return false;
if(L.lenght>=L.listsize)
{
ElemType newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
return false;
L.elem=newbase;
L.listsize=L.listsize+newbase;
}
q=&(L.e[i-1]);
for(p=&(L.e[L.length-1]);p>=q;p--)
{
*(p+1)=*p;
}
*q=e;
L.length++;
return ture;
}
3.线性表元素删除
bool ListInsert_Sq(SqList &L,int i,&ElemType e)
{
if(i<1||i>L.length-1)
return false;
q=&(L.e[i-1]);
for(p=&(L.e[L.length-1]);p>=q;p--)
{
*(p-1)=*p;
}
L.length++;
return ture;
}