顺序表与单链表

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

顺序表内存中地址连续,长度不变更,支持随机查找,可以在时间复杂度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
时间: 2024-08-01 08:36:42

顺序表与单链表的相关文章

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protected Object[] element; 4 5 public SeqList(int length) { 6 this.element = new Object[length]; 7 this.n = 0; 8 } 9 10 public SeqList() { 11 this(64); 12 } 13 1

数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表.单链表基本操作的实现   l  实验目的 1.顺序表 (1)掌握线性表的基本运算. (2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作. (3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力. l  实验内容 1. 顺序表 1.编写线性表基本操作函数: (1)InitList(LIST *L,int ms)初始化线性表: (2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素: (3)DeleteList1

顺序表与单链表的区别及优缺点

线性表之顺序表与单链表的区别及优缺点 尊重原创 -->原文链接 --> 侵权删 这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多. 顺序表描述: 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n 其中,L是元素占用存储单元的长度. 单链表描述: 单链表

九、顺序表和单链表的对比分析

1.如何判断某个数据元素是否存在于线性表中? find()操作: 可以为线性表List增加一个查找操作 int find(const T& e)const; 参数:待查找的数据元素 返回值: 大于0:数据元素在线性表中第一次出现的位置 -1:数据元素不存在 针对基础数据类型,首先在顶层父类List中增加一个虚函数virtual int find(const T& e) const = 0;,然后在各子类中实现这个函数 // 顺序表中的实现 SeqList.h int find(const

数据结构复习---顺序表和单链表

1.前言: 最近比较浮躁,想学习一门新的技术却总是浅尝辄止,遇到不懂的地方就想跳过去,时间长了,心态就有点崩了.静下心来,去喝了几碗心灵鸡汤.鸡汤博主感动到了我:"无专注,无风景.不要太贪心,一次只做一件事,而且只做最重要的事.".于是乎,我把家里翻了个底朝天,找到了我垫在床底下的<数据结构>这本书,觉得自己是时候静下心来好好复习一下基础了.今天刚看到顺序表和链表,把我的学习心得记录在这里.也希望自己能坚持,老老实实的把这本书复习完. 2.数据结构的重要性: 讲一门知识之前

线性表的链式存储——顺序表和单链表的对比分析

1,线性表两种实现: 1,顺序表: 2,单链表: 2,问题: 1,如何判断某个数据元素是否存在线性表中? 1,遍历线性表: 2,封装这个遍历操作: 3,遗失的操作 - find: 1,可以为线性表(List)增加一个查找操作: 2,int find(const T& e) const; 1,参数: 1,待查找的数据元素: 2,返回值: 1,>= 0:数据元素在线性表中第一次出现的位置: 2,-1:数据元素不存在: 3,遍历中会有相等和不等操作符,当比较对象是类的时候,需要类继承自 Objec

用模板实现顺序表与单链表

//顺序表 #include<iostream> using namespace std; template<typename T> class SeqList { public: SeqList(); ~SeqList(); SeqList(const SeqList& s); SeqList& operator=(const SeqList &s); void _CheakCapacity(); void PushBack(const T& x)

数据结构之线性表(顺序表,单链表)——图书管理系统

顺序表: 代码如下: 1 #include<iostream> 2 #include<fstream> 3 #include<string> 4 #include<iomanip> 5 using namespace std; 6 #define OK 1 7 #define ERROR 0 8 #define OVERFLOW -2 9 typedef int Status; 10 typedef int ElemType; 11 12 #define M

线性表——顺序表与单链表学习小结

线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改. 链表 链表是一种物理存储结构上非连续.非顺序的存储结构,数据