数据结构第二章线性表总结

第二章我们学习了很长时间,主要学习了线性表的逻辑结构,物理结构和算法实现。

         线性表是一种数据元素有序的逻辑结构,通常采用顺序存储结构和链式存储结构。线性表采用顺序存储结构时,有利用线性表长度的计算、线性表数据元素的存取和数据元素的遍历,同时也从物理结构上反映了线性表数据元素的逻辑结构,有点类似于c语言中的数组,但是采用顺序存储结构时,插入和删除数据元素时,要移动较多的数据元素;采用链表结构存储的线性表,克服了插入和删除数据元素时要移动较多元素的缺点,其只要寻找到需要插入和删除的数据元素处,处理相应的指针就可以实现数据元素的插入和删除,同时也和顺序存储的线性表一样方便遍历,但是其不利于计算线性表的长度,线性表的链表存储结构有以下几种常见类型:采用带头指针和头结点的单链表、采用仅带头指针的单链表、带头指针和头结点的循环链表、带头指针和尾结点的循环链表、双向链表等形式。在实际应用中,结合顺序表易于计算表长和链表易于插入和删除的特点,实际一般采用两者结合的一种单链表,其链表类型为带有头指针(含头结点)和尾指针,以及含有线性表长度的分量,在一元多项式的运算中采用的就是这种链式存储结构。

        总而言之,线性表是非常重要的数据结构的基础。后面一章的栈和队列,也可以说是操作受限的线性表,因此学好线性表对于学好后面的章节有很大的意义。

知识点:线性表的基本运算有:

  1)InitList(L),构造空表,即表的初始化;

  2)ListLength(L),求表的结点个数,即表长;

  3)GetNode(L,i),取表中第i个结点,要求1≤i≤ListLength(L);

  4)LocateNode(L,x)查找L中值为x的结点并返回结点在L中的位置,有多个x则返回首个,没有则返回特殊值表示查找失败。

  5)InsertList(L,x,i)在表的第i个位置插入值为x的新结点,要求1≤i≤ListLength(L)+1;

  6)DeleteList(L,i)删除表的第i个位置的结点,要求1≤i≤ListLength(L);

线性结构的特点:(1)非空集中,有唯一的第一个元素;

                            (2)非空集中,有唯一的最后一个元素;

                            (3)除第一个元素外,每个元素均只有一个前驱;

(4)除第后一个元素外,每个元素均只有一个后继;

2.1 线性表的类型定义

      线性表:常见的一种数据结构,在同一线性表中的数据元素具有相同特性,相邻数据元素之间存在着序偶关系;

     线性表抽像数据类型基本操作:构造空的线性表、销毁线性表、置空线性表、判断表是否为空、求线性表的长度、

                                                      获取第i个数据元素的值、求满足特定关系的位序、求数据元素的前驱、求后继元素的后继、

                                                      插入、删除、遍历等12个基本操作;

     线性表的应用实例:(1)求集合的并集;(2)求集合的归并;

 

### 数据结构线性表的应用 #### 线性表的概念及其重要性 线性表是一种常见的数据结构,它由一组具有相同特性的数据元素组成,并且这些元素之间存在一对一的关系。在线性表中,除了第一个和最后一个元素外,其他每个元素都有唯一的一个前驱和后继[^1]。 #### 线性表的具体应用示例 以下是几个具体的线性表应用场景: 1. **多项式的表示与计算** 多项式可以通过线性表的形式进行存储和表达。例如,对于一元 m 次多项式 \( P(x) \),可以用一个线性表 Q 来表示其系数序列。如果需要对两个多项式进行加法运算,也可以通过创建一个新的线性表 R 来保存结果[^2]。 2. **字符串处理** 字符串本质上是一个字符型的线性表,在实际编程过程中经常涉及字符串的拼接、查找以及替换等操作。这些都可以基于线性表的基本操作实现。 3. **学生信息管理系统** 学生的信息(如学号、姓名、成绩等)可以被看作是由多个字段组成的记录集合,这种记录集合通常会以线性表形式管理。比如使用顺序表或者单链表来维护学生的成绩单并支持增删改查功能。 4. **栈和队列的基础构建** 虽然栈和队列有各自特殊的访问规则,但它们实际上也是特定类型的线性表。因此理解好基础的线性表概念有助于进一步掌握更复杂的抽象数据类型。 #### 实现细节——C++ 中的顺序表操作 下面展示如何利用 C++ 完成一些基本的顺序表操作,包括初始化、插入、删除等功能。 ##### 初始化顺序表 ```cpp #define MAXSIZE 100 // 声明顺序表的最大长度 typedef struct { ElemType* elem; // 线性表的基地址(初始地址) int length; // 顺序表的实际长度 } SqList; // 初始化函数定义 void InitList(SqList& L){ L.elem = new ElemType[MAXSIZE]; L.length = 0; } ``` ##### 删除指定值的所有节点 当需要高效地从顺序表中移除所有等于某个给定值 `x` 的元素时,可采取双指针技术优化性能至 O(n)[^4]: ```cpp bool RemoveAllX(SqList &L, const ElemType x){ if (L.length == 0 || !L.elem) return false; int i=0,j=0; while(i<L.length){ if(L.elem[i]!=x){ L.elem[j++]=L.elem[i++]; } else{ ++i; } } L.length=j; return true; } ``` #### 结论 通过对上述理论知识的学习及实践案例分析可以看出,无论是简单的数组还是动态分配内存空间形成的向量容器都属于广义上的线性表范畴。熟练运用各种针对线性表的操作技巧不仅能够提高程序运行效率还能增强解决问题的能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值