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

顺序表与单链表

时间:2015-04-11 16:06:33      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

 初学数据结构,对顺序表与单链表的概念与操作有点模模糊糊,为此特地查阅了资料,了解了不少,以下是对他们的总结:

  顺序表内存中地址连续长度不变更,支持随机查找,可以在时间复杂度O(1)内查找元素,适用于大量访问元素而少量增添或删除的程序。链表内存地址非连续长度可以变化,算法时间复杂度为O(n),适用于需要进行大量增添或删除元素操作,而对访问无需求的程序。

  下面来看看他们的基本操作(查找,删除,插入)的区别:

顺序表的查找:

int GetElem(Seqlist L,int i,DateType *e)
/*查找顺序表中第i个元素*/
{
    if(i<1||i>L.length)
        return -1;
    *e=L.list[i-1];
    return 1;
}

链表的查找:

ListNode*Get(LinkList head,int i)
/*查找链表中第i个元素*/
{
    ListNode *p;
    int j;
    if(head->next==NULL)
        return NULL;
    if(i<1)
        return 0;
    j=0;
    p=head;
    while(p->next!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    if(j==i)
        return p;
    else
        return NULL;
}

顺序表按内容查找:

int LocateElem(Seqlist L,DateType e)
/*查找顺序表e的位置*/ {
for(i=0;i<L.length;i++) { if(L.list[i]==e) retuen i; } return 0; }

链表按内容查找:

ListNode*LocateElem(LinkList head,DateType e)
{
    ListNode *p;
    p=head->next;/*指向第一个节点*/
    while(p)
    {
        if(p->date!=e)
            p=p->next;
        else
            break;
    }
    return p;
}

  相比较而言,顺序表对查找的操作比链表要简单,可以随机查找,但是对插入与删除而言,链表要比顺序表来操作要更方便。因为顺序表的插入时要移动,从最后面开始,再倒数第二个,直到插入的后一个位置才停止,这增加了时间复杂度。删除也与此相似,要前移。

  顺序表的插入:

int InserList(Seqlist *L,int i,DateType e)
{
    int j;
    if(i<1||i>L.length)//位置合不合法
        return -1;
    else if(L->length>SIZE)
     {   printf("顺序表已经满了。");
        return 0;
      }
    else
        for(j=L->length;j>=i;j--)
            L->List[j]=L->List[j-1];//后移
            L->List[i-1]=e;
            L->length=L->length+1;
    retuen 1;
}

顺序表的删除:

int DeleteList(Seqlist *L,int i,DateType e)
{
    int j;
    if(i<1||i>L.length)//位置合不合法
        return -1;
    else if(L->length==0)
     {   printf("顺序表空的。");
        return 0;
      }
    else
        for(j=i;j<=L->length;j++)
            L->List[j]=L->List[j-1];//前移
            L->length=L->length-1;
    retuen 1;
}

  因为顺序表长度不变,所以操作前必须先判断。插入看满没满,删除看空不空,进行这两个操作都要看位置合不合理。

链表的插入:

Status ListInsert_L(LinkList &L, int i, ElemType e){
    //在带头结点的单链线性表L中第i个位置之前插入元素e
    LinkList p=L , s;
    int j=0;
    while (p && j<i-1) {p=p->next; ++j;} //寻找第i-1个结点
    if (!p || j>i-1) return ERROR; //i小于1或者大于表长
    s=(LinkList) malloc (sizeof (LNode)); //生成新结点
    s->data=e; s->next=p->next; //插入L中
    p->next=s;
    return OK;
}//ListInsert_L

链表的删除:

Status ListDelete_L(LinkList &L, int i, ElemType &e){
    //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
    LinkList p=L , q;
    int j=0;
    while (p->next && j<i-1){ //寻找第i个结点,并令p指向其前趋
        p=p->next; ++j;
    }
    if (!(p->next) || j>i-1) return ERROR; //删除位置不合理
    q=p->next; p->next=q->next; //删除并释放结点
    e=q->data; free(q);
    return OK;
}//ListDelete_L

 

顺序表与单链表

标签:

原文地址:http://www.cnblogs.com/dawntodusk/p/4417827.html

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