数据结构—线性表的链式表示

本文介绍了线性表的链式表示,包括链式存储结构的概念,链表的类型定义,单链表的基本操作如初始化、取值、查找、插入和删除的实现,以及算法效率分析。链表的特点在于结点位置任意,逻辑相邻的元素物理上可能不相邻,其优点是动态扩充和高效插入删除,缺点是存取效率较低。
摘要由CSDN通过智能技术生成

1.相关概念

  • 链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
  • 线性表的链式表示又称为非顺序映像或链式映像。
  • 与链式存储有关的术语:
    • 1、结点:数据元素的存储映像。由数据域和指针域两部分组成
    • 2、链表: n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构
    • 3、单链表、双链表、循环链表:
      • 结点只有一个指针域的链表,称为单链表或线性链表;
      • 有两个指针域的链表,称为双链表;
      • 首尾相接的链表称为循环链表。
    • 4、头指针、头结点和首元结点:
      • 头指针是指向链表中第一个结点的指针
      • 首元结点是指链表中存储第一个数据元素a1的结点
      • 头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息。

  • 讨论1. 如何表示空表?
    • 有头结点时,当头结点的指针域为空时表示空表.

  • 讨论2. 在链表中设置头结点有什么好处?
    • ⒈便于首元结点的处理 首元结点的地址保存在头结点的指针域中,所以在链表的第一个位置上的操作和其它位置一致,无须进行特殊处理;
    • ⒉便于空表和非空表的统一处理 无论链表是否为空,头指针都是指向头结点的非空指针,因此空表和非空表的处理也就统一了。
  • 讨论3. 头结点的数据域内装的是什么?
    • 头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值

2.单链表的类型定义

typedef struct LNode
{
     ElemType   data;       //数据域
     struct LNode  *next;   //指针域
}LNode,*LinkList;   
                // *LinkList为Lnode类型的指针
  • 注意区分指针变量结点变量两个不同的概念:
    • 指针变量p:表示结点地址:LNode *p=LinkList p
    • 结点变量*p:表示一个结点

3.单链表基本操作的实现

3.1 初始化(构造一个空表 )

  • 算法步骤 
    • 生成新结点作头结点,用头指针L指向头结点 
    • 头结点的指针域置空。
  • 算法描述
Status InitList_L(LinkList &L)
{ 
   L=new LNode;                    	
   L->next=NULL;     
   return OK; 
} 

3.2 取值(根据位置i获取相应位置数据元素的内容)

  • 算法步骤 
    • 从第1个结点(L->next)顺链扫描,用指针p指向当前扫描到的结点,p初值p = L->next。
    • j做计数器,累计当前扫描过的结点数,j初值为1。
    • 当p指向扫描到的下一结点时,计数器j加1。
    • 当j = i时,p所指的结点就是要找的第i个结点。
  • 算法描述

                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值