线性表

线性表

定义:

是零个或多个具有相同类型的数据元素的有限序列, 相邻元素具有前驱和后继关系。

线性表的顺序储存结构: --顺序表:

特点:

线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.

作用:

线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素在物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。
顺序存储的实现:一维数组存储顺序表中的数据

顺序表支持的操作:增删查改判空求长等基本操作(一维数组的简单操作)

优点:

(1) 无需为表示结点间的逻辑关系而增加额外的存储空间,因为逻辑上相邻的元素其存储的物理位置也是相邻的;
(2) 可方便地随机存取表中的任一元素。

缺点:

(1)插入或删除运算不方便,除表尾的位置外,在表的其它位置上进行插入或删除操作都必须移动大量的结点,其效率较低;
(2) 由于顺序表要求占用连续的存储空间,存储分配只能预先进行静态分配,因此当表长变化较大时,难以确定合适的存储规模。

单链表:

通过指针把它的一串存储结点链接成一个链 ,存储结点由两部分组成: data字段 ,link字段.

头结点:

如果链表有头节点,则链式结构中的第一个节点称为头结点:其数据域可以存储一些附加信息,如链表长度;其指针域指向链表中的第一个节点。
带头结点
头插法

for (int i=0; i<n; i++){ 
    s=new Node<T>; 
    s->data=a[i];  //为每个数组元素建立一个结点
    s->next=first->next;
    first->next=s;
}

尾插法

for (int i=0; i<n; i++)	{ 
        s=new Node<T>; 
        s->data=a[i];  //为每个数组元素建立一个结点
        r->next=s; r=s;      //插入到终端结点之后
	}
    r->next=NULL;    //将终端结点的指针域置空

不带头结点
头插法

{
  first=NULL;
  for(int i=0;i<n;i++)    { 
       s=new node<T>;
       s->data=a[i];
       s->next=first;
       first=s;   
  }
}

尾插法

node<T> *r;
    head=NULL;
    if(n<=0)return;
    s=new node<T>;
    s->data=a[0];
    s->next=head;
    head=s;   
    r=head;
    for(int i=1;i<n;i++)    { 
         s=new node<T>;
         s->data=a[i];
         r->next=s;
         r=s;   
    }
单链表的插入:

1 工作指针p初始化,计数器初始化
2 查找第i-1个节点,并使工作指针p指向该节点
3 若查找不成功(P==NULL),说明位置错误,抛出位置异常,否则
3.1 生成一个元素值为x的新节点s
3.2 将s插入到p之后

template <class T>  
void LinkList<T>::Insert(int i, T x){  
Node<T> *p; int j;
p=first ; j=0;    //工作指针p初始化
while (p && j<i-1)   {
  p=p->next;   //工作指针p后移
  j++;
}
 if (!p) throw "位置";
 else { 
   Node<T> *s;
   s=new Node<T>; 
   s->data=x;  //向内存申请一个结点s,其数据域为x
   s->next=p->next;       //将结点s插入到结点p之后
   p->next=s;	
 }
}
单链表的删除:
template <class T>  
T LinkList<T>::Delete(int i){ 
 Node<T> *p; int j;
 p=first ; j=0;  //工作指针p初始化
 while (p && j<i-1) {  //查找第i-1个结点
   p=p->next; 
   j++;
 }
 if (!p || !p->next) throw "位置";  //结点p不存在或结点p的后继结点不存在
   else {
 	     Node<T> *q; T x;
         q=p->next; x=q->data;  //暂存被删结点
         p->next=q->next;  //摘链
         delete q; 
         return x;
   }
}

在这里插入图片描述

循环链表:

将单链表或者双链表的头尾结点链接起来,就是一个循环链表。不增加额外存储花销,却给不少操作带来了方便,从循环表中任一结点出发,都能访问到表中其他结点。

双链表:

p->llink->rlink = p = p->rlink->llink
单链表的主要不足之处是:link字段仅仅指向后继结点,不能有效地找到前驱,双链表弥补了上述不足之处,增加一个指向前驱的指针 。

间接寻址(指针数组):

将指针和数组结合起来的一种方法,它将数组中的存储数据元素的单元改为存储指向该元素的指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值