您的位置:首页 > 理论基础 > 数据结构算法

数据结构啊----线性表的链式存储

2016-08-02 13:17 302 查看
到了我最怕的链表了,真的是,逢考必错。看知识点也知道是那么回事,就是一做题就完蛋了。根本想不起是怎么怎么弄。
慢慢看吧。


以元素+指针=结点
以结点的序列表示线性表--称作链表
2.1 链式存储结构之一:单链表
利用单链表(也称线性链表)来实现,从链表的第一个数据元素开始,依次将线性表的结点存入。需要注意的是,链表的每个数据元素除了要存储线性表的数据元素信息之外,还要有一个成分存储其后继结点的指针,单链表就是通过这个指针来表明数据元素之间的先后关系的。



下面看一下头指针头结点等的区别
 




单链表在保存时,一般在第一个结点之前辅设一个结点,称为头结点。头结点的数据域可以不存任何信息,也可以存储线性表的长度等附加信息,其指针域中存储指向第一个结点的指针(即第一个元素结点的存储位置)。故单链表的头指针指向头结点,如果头结点的指针域为空,则说明是空表(head->next ==NULL)。

1)
单链表结构

    typedef struct LNode{
       ElemType data ;

       struct LNode * next ;

    }LNode , *LinkList ;
2)单链表的各种操作
① 取得第i个元素的值
Status GetElem_L(LinkList L , int
i , ElemType &e)
{ //L为带头结点的单链表的头指针
p = L.next ; //p指向第一个结点
j = 1 ;

while (p && j<i)
{ p = p->next ;

j++ ;

}
if (!p || j>i) return ERROR ; //不存在
e= p->data ;

return OK ;
}
说明:读取第i个元素须从头指针开始查找,因此单链表是一种“非随机存取”的数据结构。
② 单链表的插入操作:
在单链表L的某结点(设该结点由指针p指向)之后插入一个新的数据元素。设该新数据元素由s指向。操作如下:s->next
= p->next ;
  p->next = s; (注意语句顺序)



 
 

Status ListInsert_L(LinkList L, int i, ElemType e) {

     // L 为带头结点的单链表的头指针,本算法

     // 在链表中第i 个结点之前插入新的元素 e

p = L;    j = 0;

while (p && j < i-1)

     { p = p->next;  ++j; }   // 寻找第 i-1 个结点

if (!p || j > i-1)

      return ERROR;     

s = (LinkList) malloc ( sizeof (LNode));

                               // 生成新结点

s->data = e;

s->next = p->next;      p->next = s; // 插入

return OK;

完成插入的技巧:先修改新结点的指针域。

③ 单链表的删除操作:
在单链表L中的某结点(该结点由指针p指向)之后的结点需要删除,则操作为:



 
 
q =
p->next ;
   p->next = q->next ;
    free(q) ;

如果不考虑释放被删除的结点,则下面的操作也是正确的:
p->next = p->next->next ;


Status ListDelete_L(LinkList &L, int i, ElemType &e) {

   // 删除以 L 为头指针(带头结点)的单链表中第 i 个结点


p = L;    j = 0;

while (p->next && j < i-1) {  p = p->next;   ++j; }

                           // 寻找第 i 个结点,并令 p 指向其前趋

if  (!(p->next) || j > i-1)

    return ERROR;  // 删除位置不合理

q = p->next;   p->next = q->next;  // 删除并释放结点

e = q->data;   free(q);

return OK;




3) 链式存储的特点
优点:每个数据元素的实际存储位置可以任意,数据元素的插入、删除变得非常容易;
缺点:① 每个数据元素增加了后继指针成分,增加了存储空间,降低了存储密度;
② 不能随机访问线性表的任一结点。(同顺序存储恰恰相反)

4) 静态链表
有时也可以采用一维数组来描述线性链表,其类型说明如下所示。
#define MAXSIZE 100
tyepdef struct {
ElemType data ;

int cur ;

} component , SLinkList[MAXSIZE] ;

可以看出,以上结构中没有出现“指针”类型的指针域,而是利用一个指示器cur来表示结点在数组中的相对位置。可以将数组的第0分量看成头结点,其指针域(cur)指示链表的第一个结点。这种存储结构仍需要分配较大的连续空间,但是在进行线性表的插入及删除操作时不需要移动元素,而仅需要修改指针,因此仍然具有链式存储结构的主要优点。为了和指针描述的线性链表相区别,我们称这种用数组实现的链表为静态链表。

链表的插入和删除很重要。主要还是弄清楚指针的指向。
哈哈哈,其实也没有那么多知识点嘛。
但是,理解最重要!哎哟,点就是这么几个点。
链表链表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: