码迷,mamicode.com
首页 > 其他好文 > 详细

线性表的链式存储结构——(2)

时间:2014-09-22 21:02:23      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   数据   2014   div   sp   

线性表的存储结构有两种:顺序存储和链式存储

顺序存储:读取数据的时间复杂度为O(1),其实就是数组,但是插入,删除的复杂度略大

链式存储:•用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。

数据域:存储数据元素信息的域
指针域:把存储直接后继位置的域
指针或链:指针域中存储的信息
结点(Node):数据域和指针域组成数据元素称为存储映像
单链表:链表的每个结点中只包含一个指针域
bubuko.com,布布扣
 
•头指针
–头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。
–头指针具有标识作用,所以常用头指针冠以链表的名字(指针变量的名字)。
无论链表是否为空,头指针均不为空
头指针是链表的必要元素
•头结点
–头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度)。
–有了头结点,对在第一元素结点前插入结点和删除第一结点起操作与其它结点的操作就统一了。
–头结点不一定是链表的必须要素。
bubuko.com,布布扣(单链表图例)
bubuko.com,布布扣(空链表图例,头结点可以没有)
C语言中可以用结构指针来描述单链表:
typedef struct Node
{
    ElemType data;      // 数据域
    struct Node* Next;  // 指针域
} Node;
typedef struct Node* LinkList;

 GetElem( LinkList L, int i, ElemType *e ):读取链表中的元素

Status GetElem( LinkList L, int i, ElemType *e )
{
    LinkList p;
    int j = 1;
    p = L -> next; 
    if ( !p || i < 1 )
    {
        return Error
    }
    while( p && j < i)
    {
        p = p -> next;
        ++j;
    }
    if ( !p )
    {
        return Error
    }
    *e = p->data
    return *e
}

 插入和删除的图示:

bubuko.com,布布扣

 

InsertElem( LinkList L, int i, ElemType *e )

Status InsertElem( LinkList L, int i, ElemType *e )
{
    LinkList p,s
    int j = 1
    p = L -> next 
    if ( !p || i < 1 )
    {
        return Error
    }
    while( p && j < i)        
    {
        p = p -> next;
        ++j;
    }
    if ( !p )
    {
        return Error
    }
    s = (LinkList)malloc(sizeof(Node));
    s -> data = e
    s -> next = p -> next;
    p -> next = s;
    return OK
}

DeleteElem( LinkList L, int i, ElemType *e)

Status DeleteElem( LinkList L, int i, ElemType *e)
{
    LinkList p;
    int j = 1;
    p = L -> next ;
    if ( !p || i < 1 )
    {
        return Error
    }
    while( p && j < i)        
    {
        p = p -> next;
        ++j;
    }
    if ( !p )
    {
        return Error
    }
    q = p -> next
    p -> next = q -> next 
    e = p -> data 
    free(q)
    return OK
}
总结:对于插入或删除数据,若数据都是一个的话,顺序存储和单链表复杂度都是,O(n)。顺序存储需要移动n-i个位置,单链表需要查找第i个数据的地址。
但是如果,需要插入和删除j个数据时,顺序存储复杂度是每次都是O(n),但单链表就只有第一次是O(n),以后都是O(1)(当然前提是连续的插入,如果断断续续的插入,优势就不明显啦。。。对于大量数据的处理,考虑到日后代码的维护,数据的存储肯定是用单链表啦。。)
 
 
 

线性表的链式存储结构——(2)

标签:style   blog   http   color   strong   数据   2014   div   sp   

原文地址:http://www.cnblogs.com/shixiaomiao/p/3986603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!