第2章 线性表《C#数据结构和算法》

( 1)除第一个位置的数据
    元素外,其它数据元素位置的前面都只有一个数据元素;( 2)除最后一个位置的
    数据元素外,其它数据元素位置的后面都只有一个元素。也就是说,数据元素是
    一个接一个的排列。因此,可以把线性表想象为一种数据元素序列的数据结构。
2.1.1 线性表的定义
线性表(List)
  线性表的接口如下所示。
  public interface IListDS<T> {
      int GetLength(); //求长度
      void Clear(); //清空操作
      bool IsEmpty(); //判断线性表是否为空
      void Append(T item); //附加操作
      void Insert(T item, int i); //插入操作
      T Delete(int i); //删除操作
      T GetElem(int i); //取表元
      int Locate(T value); //按值查找
      }
  为了和.NET 框架中的接口 IList 相区分,在 IList 后面加了“DS”,“DS”
  表示数据结构。
2.2 顺序表
2.2.1 顺序表的定义
    在计算机内,保存线性表最简单、最自然的方式,就是把表中的元素一个接
    一个地放进顺序的存储单元,这就是线性表的顺序存储(Sequence Storage)。线性
    表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,
    用这种方式存储的线性表叫顺序表(Sequence List),如图 2.1 所示。顺序表的特点
    是表中相邻的数据元素在内存中存储位置也相邻。
        0 1 … i-1 i … n-1 … maxsize-1
        a1 a2 … ai-1 ai ai+1 … an …
        C#语言中的数组在内存中占用的存储空间就是一组连续的存储区域,因此,
    数组具有随机存取的特点。所以,数组天生具有表示顺序表的数据存储区域的特性。
    由于任何线性表都可以进行倒置操作,所以可以把该操作作为 IListDS 接口
的一个成员方法进行声明,然后在各线性表类中实现。IListDS 接口中倒置方法
Reverse 的声明如下:
public interface IListDS<T> {
……
void Reverse();
}

【例 2-2】有数据类型为整型的顺序表 La 和 Lb,其数据元素均按从小到大的升
序排列,编写一个算法将它们合并成一个表 Lc,要求 Lc 中数据元素也按升序排
数据结构( C#语言版)2.2 顺序表 37
列。
    算法思路:依次扫描 La 和 Lb 的数据元素,比较 La 和 Lb 当前数据元素的
    值,将较小值的数据元素赋给 Lc,如此直到一个顺序表被扫描完,然后将未完
    的那个顺序表中余下的数据元素赋给 Lc 即可。 Lc 的容量要能够容纳 La 和 Lb
    两个表相加的长度。
按升序合并两个表的算法 C#实现如下:
    public SeqList<int> Merge(Seqlist<int> La, SeqList<int> Lb)
    {
        SeqList<int> Lc = new SeqList<int>(La.Maxsize + Lb.Maxsize);
        int i = 0;
        int j = 0;
        int k = 0;
    //两个表中都有数据元素
    while ((i <= (La.GetLength()-1))&& (j <= (Lb.GetLength()-1)))
    {
    if (La[i] <Lb[j])
    {
        Lc.Append(La[i++]);
    }
    else
    {
        Lc.Append(Lb[j++]);
    }
    }
    //a表中还有数据元素
    while (i <= (La.GetLength() - 1))
    {
        Lc.Append(La[i++]);
    }
    //b表中还有数据元素
    while (j <= (Lb.GetLength() - 1))
    {
        Lc.Append(Lb[j++]);
    }
    return Lc;
    }
算法的时间复杂度是 O(m+n), m 是 La 的表长, n 是 Lb 的表长。
2.3 单链表
    顺序表是用地址连续的存储单元顺序存储线性表中的各个数据元素,逻辑上
    相邻的数据元素在物理位置上也相邻。因此,在顺序表中查找任何一个位置上的
    数据元素非常方便,这是顺序存储的优点。但是,在对顺序表进行插入和删除时,
    需要通过移动数据元素来实现,影响了运行效率。本节介绍线性表的另外一种存
    储结构——链式存储(Linked Storage),这样的线性表叫链表(Linked List)。链表不
    要求逻辑上相邻的数据元素在物理存储位置上也相邻,因此,在对链表进行插入
    和删除时不需要移动数据元素,但同时也失去了顺序表可随机存储的优点。
2.4 其他链表
2.4.1 双向链表
    前面介绍的单链表允许从一个结点直接访问它的后继结点,所以, 找直接后
    继结点的时间复杂度是 O(1)。但是,要找某个结点的直接前驱结点,只能从表的
    头引用开始遍历各结点。如果某个结点的 Next 等于该结点,那么,这个结点就
    是该结点的直接前驱结点。也就是说,找直接前驱结点的时间复杂度是 O(n), n
    是单链表的长度。当然,我们也可以在结点的引用域中保存直接前驱结点的地址
    而不是直接后继结点的地址。这样,找直接前驱结点的时间复杂度只有 O(1),
    但找直接后继结点的时间复杂度是 O(n)。如果希望找直接前驱结点和直接后继
    结点的时间复杂度都是 O(1),那么,需要在结点中设两个引用域,一个保存直
    接前驱结点的地址,叫 prev,一个直接后继结点的地址,叫 next,这样的链表就
    是双向链表(Doubly Linked List)。双向链表的结点结构示意图如图 2.15 所示。
    prev data next
    图 2.15 双向链表的结点结构示意图
//a tong 的单链表问题ListNode* root = &ListNode(0);
         ListNode* curNode = root;
         for (int i = 1; i < 100; i++) {
             curNode->next = New ListNode(i);
             curNode = curNode->next;
         }
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
时间: 2024-12-17 17:57:35

第2章 线性表《C#数据结构和算法》的相关文章

【学习总结】《大话数据结构》- 第3章-线性表

[学习总结]<大话数据结构>- 总 启示: 线性表:零个或多个数据元素的有限序列. 目录 3.1 开场白 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 线性表的顺序存储结构 3.5 顺序存储结构的插入与删除 3.6 线性表的链式存储结构 3.7 单链表的读取 3.8 单链表的插入与删除 3.9 单链表的整表创建 3.10 单链表的整表删除 3.11 单链表结构与顺序存储结构优缺点 3.12 静态链表 3.13 循环链表 3.14 双向链表 3.15 总结回顾 3.16 结尾语 -

第二章——线性表

线性表 一.定义 线性表是最常用且最简单的一种数据结构. 简而言之,一个线性表是n个数据元素的有限的序列. 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的 (注意,这句话只适用大部分线性表,而不是全部.比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点).by~百度百科 二.线性表的顺序表示和实现 1.顺序表示指的是用一组地址连续的储存单元依次储存线性表的数据元素. 通常用数组来

数据结构期末复习第二章线性表

第二章:线性表 1.线性结构的基本特征答:线性结构是若干数据元素构成的有序(次序)集① 集合中必存在唯一的一个“第一元素”:② 集合中必存在唯一的一个 “最后元素”:③ 除第一元素之外,均有 唯一的前驱:④ 除最后元素之外,均有 唯一的后继. 2.线性表的顺序存储结构和链式存储结构分别是______.(  D )   A. 顺序存取的存储结构.顺序存取的存储结构  B. 顺序存取的存储结构.随机存取的存储结构   C. 随机存取的存储结构.随机存取的存储结构  D. 随机存取的存储结构.顺序存取

数据结构-王道2017-第2章 线性表

1. 线性表的定义和基本操作 1.1 线性表的定义 线性表电话i具有相同数据类型的n(n >= 0)个数据元素的有限序列.其中n为表长,当n=0时,该线性表是一个空表.若用L命名线性表,则一般表示为: L=(a1,a2,a3...ai,ai+1...an) 其中,a1是唯一的第一个数据元素,又称为表头元素:an是唯一的最后一个数据元素,又称为表尾元素.除第一个元素外,每个元素有且仅有一个直接前驱.除最后一个元素外,每个元素有且仅有一个直接后继.以上就是线性表的逻辑特性,这种线性有序的逻辑结构正是

数据结构之第二章线性表之静态链式存储

1--特点:用一维数组来描述线性表,用游标代替指针指示节点在数组中的相对位置.不设“指针”类型的高级语言中适用链表结构. 2--线性表的静态链式存储结构 ////  静态单链表.h//  单链表的静态存储//// 6 //  Copyright (c) 2014年 dashuai. All rights reserved.// #ifndef SLIST_H#define SLIST_H#include <stdio.h>#include <stdlib.h> #define MA

数据结构之第二章线性表之链式存储

1~~特点:逻辑上相邻的元素,他的物理位置不一定相邻,其实几乎是不像邻的.表中的元素只能顺序访问,插入,删除等操作只需修改指针而不需要移动元素,存储空间利用率高,表的容量可以动态变化.适合个数变化大的情况. 2--链式存储`的存储结构 typedef struct Node{ int data; struct Node *next; }NODE,*PNODE; 3~~线性表的基本操作 (1)线性表的的  插表头  建立算法 ” 插表头“方式得到的线性链表,元素存储的顺序和输入顺序相反,这与栈的特

数据结构之第二章线性表

1 线性表的顺序存储 (1)线性表的顺序存储特点:逻辑上相连的元素,物理位置也相连.可随机访问表中元素,表中的存储位置可以用一个简单的,直观的公式表示,但是插入和删除都要移动大量的元素,效率不高,适合元素个数变化不大的情况,此时,如数据元素按照一定的顺序存储,则称为顺序存储的有序表,简称为    静态表. (2)线性表的动态分配顺序存储结构 typedef struct{ Elemtype *elem; //存储空间起始地址 int length; //当前长度 int listsize; //

数据结构第一章——线性表的实现

#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OVERFLOW -2 #define ERROR 0 #define OK 1 using namespace std; //typedef int Status; typedef struct { int *elem; //指向整个线性表

数据结构——第一章线性表:03线性表的链式存储结构

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC" } span.s1 { font: 12.0px Helvetica } span.s2 { color: #fb0207 } 1.单链表:用一组地址任意的存储单元存放线性表中的数据元素.以元素(数据元素的映象)+ 指针(指示后继元素存储位置)= 结点(表示数据元素). 2.以线性表中第一个数据元素a1的存储地址作为线性表的地址,称作线性表的头指针.为了