这学期一开始,接触到线性表的时候,其实上课有点懵懵的,毕竟上学期都是学具体的C++语言,而在讲线性表的时候转变为了更抽象的表示方法,但是在具体理解时用C++的类,链表去代入理解,我还是有一定收获的。

首先是线性表的定义啦,这里可以通过C++中的结构体/类去实现。

先是顺序表

#define MAXSIZE 20

typedef int ElemType;
typedef struct
{
ElemType date[MAXSIZE];    //存放顺序表中的元素
int length;               //存放顺序表的长度
}SqList;              //声明顺序表的类型

然后是初始化:

void InitList(SqList &L)
{
L.length = 0;
}

 

顺序表的插入

int ListInsert(SqList *L,int i,ElemType e)
{
if(L -> length == MAXSIZE)
return 0;
if(i < 1 || i > length + 1)
return 0;
if(i < L -> length)
{
for( k = L->length; k > i; k--)
L->date[k] = L->date[k - 1];
}
L -> date[i - 1] = e;
L -> length++;
return 1;
}

删除:

int ListInsert(SqList *L,int i,ElemType e)
{
if(L -> length == MAXSIZE)
return 0;
if(i < 1 || i > length + 1)
return 0;
if(i < L -> length)
{
for( k = L->length; k > i; k--)
L->date[k] = L->date[k - 1];
}
L -> date[i - 1] = e;
L -> length++;
return 1;
}

 

然后是链表

        在链式存储结构中,每个结点用于存储线性表的一个元素,每个结点不仅包含有所存元素本身的信息(称之为数据域),而且包含有元素之间逻辑关系的信息,即前驱结点包含有后继结点的地址信息,这称为指针域,这样就可以通过前驱结点的指针域方便地找到后继结点。链表由多个结点组成,这些结点的地址可以是连续,也可以不连续,这就是说这些数据元素可以存储在内存中未被占用的任意位置。

       链表由如下几种形式

       (1)单链表:在每个结点中包含有数据域外,只设置一个指针域,用于指向其后继结点

        

 

         (2)双链表:在每个结点中包含有数值域外,设置有两个指针域,分别用于指向其前驱结点和后继结点

         (3)循环链表:循环链表是另一种形式的链式存储结构。它的特点是表中尾结点的指针域不变,而是指向表头结点,整个链表形成一个环

      (4)静态链表:借用一维数组来描述线性链表,数组中的一个分量表示一个节点,同时使用游标代替指针一显示节点在数组中的相对位置。数组中的第0个分量可以看成头节点,其指针域指示静态链表的第一个节点。

 不过后面这几种链表上课只是提到,自己还没实践过,所以只是知道概念的程度而已。

链表的特点:由于每个继节点带有指针域,因此在存储空间上比顺序表要付出较大的代价,所以顺序表比链表的存储密度高。还有链表不具有顺序表的随机存取特点,但在链表中插入或删除操作时,只需修改相关节点的指针域即可,不需要移动节点。

嗯上课讲例子的时候其实是有点懵的......不过可以通过多看大佬的代码可以改善自己。