一、线性表
1. 相关概念
定义:线性表是具有相同特性 数据元素的一个有限 序列。序列中所含元素的个数叫做线性表的长度,用 n n n 表示。当 n = 0 n=0 n = 0 时,即表示该表为空表。
表头、表尾、前驱、后继 ;
存储结构:顺序存储结构(顺序表)、链式存储结构(链表) ;
链表的形式:单链表、双链表、循环单链表、循环双链表、静态链表(结构体数组); 注意:静态链表中的指针是指存储数组下标的整形变量;
2. 顺序表和链表的比较
顺序表:具有随机访问特性 ,要求占用连续的存储空间(静态分配 );
链表:不支持随机访问,存储空间利用率较顺序表稍低,支持动态分配 ;
基于空间 的比较 1)存储分配 的方式: 顺序表的存储空间是一次性分配的,链表的存储空间是多次分配的; 2)存储密度 ( 存储密度 = 站点值域所占的存储量 / 站点结构所占的存储总量) 顺序表的存储密度 = 1,链表的存储密度<1(结点中有指针域);
基于时间 的比较 1)存取方式 : 顺序表可以随机存取,也可以顺序存取;链表只能顺序存取; 【所谓顺序存取,以读取为例,要读取某个元素必须遍历其之前的所有元素才能找到它并读取之】 2)插入/删除时移动元素的个数 : 顺序表平均需要移动近一半元素;链表不需要移动元素,只需要修改指针。 具有 n n n 个元素的顺序表,插入一个元素所进行的平均移动个数为: E = p ∑ i = 1 n ( n − i ) = n − 1 2 E=p\sum_{i=1}^n(n-i)=\frac{n-1}{2} E = p i = 1 ∑ n ( n − i ) = 2 n − 1
3. 顺序表
结构体定义:
typedef int ElementType;
typedef int Position;
#define MAXSIZE 10000
typedef struct LNode * List;
struct LNode {
ElementType Data[ MAXSIZE] ;
Position Last;
} ;
基本操作
List MakeEmpty ( )
{
List L;
L = ( List) malloc ( sizeof ( struct LNode) ) ;
L- > Last = - 1 ;
return L;
}
#define ERROR -1
Position Find ( List L, ElementType X)
{
Position i = 0 ;
while ( i <= L- > Last && L- > Data[ i] != X)
i++ ;
if ( i > L- > Last) return ERROR;
else return i;
}
bool Insert ( List L, ElementType X, Position P)
{
Position i;
if ( L- > Last == MAXSIZE - 1 ) {
printf ( "表满" ) ;
return false ;
}
if ( P< 0 || P> L- > Last + 1 ) {
printf ( "位置不合法" ) ;
return false ;
}
for ( i = L- > Last; i >= P; i-- )
L- > Data[ i + 1 ] = L- > Data[ i] ;
L- > Data[ P] = X;
L- > Last++ ;
return true ;
}
bool Delete ( List L, Position P)
{
Position i;
if ( P< 0 || P> L- > Last) {
printf ( "位置%d不存在元素" , P) ;
return false ;
}
for ( i = P + 1 ; i <= L- > Last; i++ )
L- > Data[ i - 1 ] = L- > Data[ i] ;
L- > Last-- ;
return true ;
}
4. 单链表(含头结点)
基本定义
typedef int ElementType;
typedef struct LNode * PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
} ;
typedef PtrToLNode Position;
typedef PtrToLNode List;
基本操作
List CreatList ( ElementType a[ ] , int n)
{
List L = ( List) malloc ( sizeof ( LNode) ) ;
L- > Next = NULL ;
Position P, tmp;
P = L;
for ( int i= 0 ; i< n; i++ ) {
tmp = ( Position) malloc ( sizeof ( LNode) ) ;
tmp- > Data = a[ i] ;
P- > Next = tmp;
P = P- Next;
}
P- > Next = NULL ;
}
#define ERROR NULL
Position Find ( List L, ElementType X)
{
Position p = L;
while ( p && p- > Data != X)
p = p- > Next;
if ( p)
return p;
else
return ERROR;
}
bool Insert ( List L, ElementType X, Position P)
{
Position tmp, pre;
for ( pre = L; pre&& pre- > Next != P; pre