第二章 线性表
置换、逆序
知识点
-
了解线性结构的特点
-
只有一个首结点和尾结点;
-
除首尾结点外,其他结点只有一个直接前驱和一个直接后继。
-
-
掌握顺序表的定义、查找、插入和删除
-
顺序表的定义
把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
-
顺序存储方法:
用一组地址连续的存储单元依次存储线性表的元素,可通过数组
V[n]
来实现。#define MAXSIZE 100 typedef struct { ElemType *e; int length; }SqList;
-
顺序表的查找(根据指定数据获取数据所在的位置)
Status Locate(SqList *List , ElemType e){ for(int i = 0 ; i < List.length ; i++){ if(List.e[i] == e){ return i+1; } } return 0; }
-
顺序表的插入(在线性表L中第i个数据元素之前插入数据元素e)
- 步骤
- 插入位置是否合法
- 存储空间是否已满
- 移动元素
- 插入元素
- 表长加一
Status Insert(SqList *L,int i,ElemType e){ //判断插入位置是否合法 if(i<1||i>L.length+1){ return ERROR; } //判断储存空间是否已满 if(L.length == MAXSIZE){ return ERROR; } //移动元素 for(int j = L.legth ; j >= i ; j++){ L.e[j] = L.e[j-1]; } //插入元素 L.e[i-1] = e; //表长加一 L.length++; return OK; }
算法分析:(算法时间主要耗费在移动元素上) AMN = n/2
- 步骤
-
顺序表的删除(删除第 i 个结点)
- 算法步骤:
- 判断位置是否合法
- 保存元素
- 移动元素
- 表长减一
Status Delete(SqList *L,int i){ //判断位置是否合法 if(i<1||i>L.length+1){ return ERROR; } //保存元素 int e = L.e[i-1]; //移动元素 for(int j = i-1;j < L.length;j++){ L.e[j] = L.e[j+1]; } //表长减一 L.length--; return OK; }
算法分析:算法时间主要耗费在移动元素的操作上 AMN = (n-1)/2
- 算法步骤:
-
查找、插入、删除算法的平均时间复杂度为O(n),显然,顺序表的空间复杂度S(n)=O(1)(没有占用辅助空间)
-
-
掌握链表的定义、创建、查找、插入和删除
-
链表的定义
- 单链表
typedef struct LNode{ ElemType e; struct LNode *next }LNode,*LinkList;
- 双向链表
typeddef struct DulNode{ ElemType data; struct DulNode *pri; struvt DulNode *next; }DulNode,*DulLinkList;
-
链表的创建
//前插法 void Create(LinkList &L,int n){ LNode *head = (LNode*)malloc(sizeof(LNode)); head->next=NULL; L = head
-