数据结构-线性表(linear_list)
1.基本定义
(1)线性表中每一个元素都只存在一个前驱和一个后继。
(2)同一线性表中的元素必定具有相同的特性。
(3)线性表中元素的个数 n 定义为线性表的长度,n=0 时称为空表。
(4)ai 是第 i 个元素,称 i 为数据元素 ai 在线性表中的位序 。
2. 线性表的实现及12个操作
(1)顺序表
#include< iostream>
#include< malloc. h>
#define list_int_size 100
#define listincrement 10
#define error 0
#define ok 1
using namespace std;
typedef struct{
int * elem;
int length;
int listsize;
} SqList;
int InitList_Sq ( SqList & L) {
L. elem= new int [ list_int_size] ;
if ( ! L. elem) return error;
L. length= 0 ;
L. listsize= list_int_size;
return ok;
}
int ListInsert_Sq ( SqList & L, int i, int e) {
if ( i< 1 || i> L. length+ 1 ) return error;
if ( L. length>= L. listsize) {
L. elem= ( int * ) realloc ( L. elem, ( L. listsize+ listincrement) * sizeof ( int ) ) ;
if ( ! L. elem) return error;
L. listsize+= listincrement;
}
int * q= & ( L. elem[ i- 1 ] ) ;
for ( int * p= & ( L. elem[ L. length- 1 ] ) ; p>= q; -- p) * ( p+ 1 ) = * p;
* q= e;
L. length++ ;
return ok;
}
int ListDelete ( SqList & L, int i, int & e) {
if ( i< 1 || i> L. length) return error;
int * p= & ( L. elem[ i- 1 ] ) ;
e= * p;
int * q= L. elem+ L. length- 1 ;
for ( ++ p; p<= q; ++ p) {
* ( p- 1 ) = * p;
}
L. length-- ;
return ok;
}
int LocateElem ( SqList L, int e) {
int i= 1 ;
int * p= L. elem;
while ( i<= L. length&& * p++ != e) i++ ;
if ( i<= L. length) return i;
else return 0 ;
}
void MergeList_Sq ( SqList La, SqList Lb, SqList & Lc) {
int * pa= La. elem, * pb= Lb. elem;
Lc. listsize= Lc. length= La. length+ Lb. length;
int * pc= Lc. elem= new int [ Lc. listsize] ;
if ( ! Lc. elem) exit ( error) ;
int * ppa= La. elem+ La. length- 1 , * ppb= Lb. elem+ Lb. length- 1 ;
while ( pa<= ppa&& pb<= ppb) {
if ( * pa<= * pb) * pc++ = * pa++ ;
else * pc++ = * pb++ ;
}
while ( pa<= ppa) * pc++ = * pa++ ;
while ( pb<= ppb) * pc++ = * pb++ ;
}
int main ( ) {
SqList L;
InitList_Sq ( L) ;
for ( int i= 1 ; i<= 120 ; i++ )
ListInsert_Sq ( L, i, i) ;
cout<< LocateElem ( L, 1 ) << endl;
int e;
ListDelete ( L, 1 , e) ;
cout<< e<< endl;
MergeList_Sq ( L, L, L) ;
cout<< LocateElem ( L, 3 ) << endl;
return 0 ;
}
(2)链表(线性链表,单链表)
#include< iostream>
#include< malloc. h>
#define error 0
#define ok 1
using namespace std;
typedef struct LNode{
int data;
struct LNode * next;
} LNode, * LinkList;
int ListInsert_L ( LinkList & L, int i, int e) {
LinkList p= L;
int j= 0 ;
while ( p&& j< i- 1 ) {
p= p- > next;
j++ ;
}
if ( ! p|| j> i- 1 ) return error;
LNode * s= new LNode ;
s- > data= e;
s- > next= p- > next;
p- > next= s;
return ok;
}
int GetElem_L ( LinkList L, int i, int & e) {
LinkList p= L- > next;
int j= 1 ;
while ( p&& j< i) {
p= p- > next;
j++ ;
}
if ( ! p|| j> i) return error;
e= p- > data;
return ok;
}
int ListDelete_L ( LinkList & L, int i, int & e) {
LinkList p= L;
int j= 0 ;
while ( p- > next&& j< i- 1 ) {
p= p- > next;
j++ ;
}
if ( ! ( p- > next) || j> i- 1 ) return error;
LNode * s= p- > next;
p- > next= s- > next;
e= s- > data;
free ( s) ;
return ok;
}
int main ( ) {
int e;
LinkList L;
ListInsert_L ( L, 1 , 1 ) ;
GetElem_L ( L, 1 , e) ;
cout<< e<< endl;
ListDelete_L ( L, 1 , e) ;
cout<< e<< endl;
return 0 ;
}
(3)静态单链表 略
(4)循环链表,双向链表 略略略 orz。。。。