数据结构之线性表(加强版)
一、顺序表
1、头文件
# ifndef LINEHEAD_H_INCLUDED
# define LINEHEAD_H_INCLUDED
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# define Maxsize 30
typedef struct
{
int data[ Maxsize] ;
int length;
} SqList;
void InitList ( SqList & L) ;
void InitPrintSqList ( SqList & L) ;
void PrintSqList ( SqList & L) ;
void Voluation ( SqList & L) ;
void Vol_Custom ( SqList & L) ;
bool Del_Min ( SqList & L, int & value) ;
void Del_x ( SqList & L, int x) ;
void VoluationOrder ( SqList & L) ;
bool Del_s_t ( SqList & L, int s, int t) ;
bool Del_s_t2 ( SqList & L, int s, int t) ;
void Del_Same ( SqList & L) ;
void Reverse ( SqList & L) ;
bool Merge ( SqList L1, SqList L2, SqList & L3) ;
# define InitSize 10
typedef struct
{
int * data;
int maxsize, length;
} SeqList;
void InitSeqList ( SeqList& L) ;
void InitData ( SeqList & L) ;
void IncreaseSize ( SeqList& L, int len) ;
void PrintSeqList ( SeqList & L) ;
int Random0_10 ( ) ;
# endif
2、静态线性表
# include "LineHead.h"
void InitList ( SqList & L)
{
for ( int i= 0 ; i< Maxsize; i++ )
{
L. data[ i] = 0 ;
}
L. length= 0 ;
}
void InitPrintSqList ( SqList & L)
{
for ( int i= 0 ; i< Maxsize; i++ )
{
printf ( "%d\t" , L. data[ i] ) ;
}
}
void PrintSqList ( SqList & L)
{
for ( int i= 0 ; i< L. length; i++ )
{
printf ( "%d\t" , L. data[ i] ) ;
}
}
void Voluation ( SqList & L)
{
srand ( ( unsigned ) time ( NULL ) ) ;
for ( int i= 0 ; i< Maxsize; i++ )
{
L. data[ i] = Random0_10 ( ) ;
}
L. length= Maxsize;
}
void Vol_Custom ( SqList & L)
{
int b[ ] = { 1 , 2 , 2 , 3 , 4 , 5 , 5 , 5 , 6 , 7 , 7 , 8 , 8 , 9 , 9 } ;
for ( int i= 0 ; i< sizeof ( b) / sizeof ( b[ 0 ] ) ; i++ )
L. data[ i] = b[ i] ;
L. length= sizeof ( b) / sizeof ( b[ 0 ] ) ;
}
bool Del_Min ( SqList & L, int & value)
{
if ( L. length== 0 )
{
return false;
}
value = L. data[ 0 ] ;
int pos = 0 ;
for ( int i= 0 ; i< L. length; i++ )
{
if ( value > L. data[ i] )
{
value = L. data[ i] ;
pos = i;
}
}
L. data[ pos] = L. data[ L. length- 1 ] ;
L. length-- ;
return true;
}
void Del_x ( SqList & L, int x)
{
int k= 0 ;
for ( int i= 0 ; i< L. length; i++ )
{
if ( L. data[ i] != x)
{
L. data[ k] = L. data[ i] ;
k++ ;
}
}
L. length= k;
}
void VoluationOrder ( SqList & L)
{
for ( int i= 0 ; i< Maxsize- 10 ; i++ )
{
L. data[ i] = i;
}
L. length= Maxsize- 10 ;
}
bool Del_s_t ( SqList & L, int s, int t)
{
int i, j;
if ( s>= t|| L. length== 0 )
return false;
for ( i= 0 ; i< L. length&& L. data[ i] < s; i++ ) ;
if ( i>= L. length)
return false;
for ( j= i; j< L. length&& L. data[ j] <= t; j++ ) ;
if ( j>= L. length)
return false;
for ( ; j< L. length; i++ , j++ )
{
L. data[ i] = L. data[ j] ;
}
L. length= i;
return true;
}
bool Del_s_t2 ( SqList & L, int s, int t)
{
int i, k= 0 ;
for ( i= 0 ; i< L. length; i++ )
{
if ( L. data[ i] >= s&& L. data[ i] <= t)
continue ;
else
{
L. data[ k] = L. data[ i] ;
k++ ;
}
}
L. length= k;
return true;
}
void Del_Same ( SqList & L)
{
if ( L. length== 0 )
return ;
int i, k;
for ( k= 0 , i= 1 ; i< L. length; i++ )
{
if ( L. data[ k] != L. data[ i] )
L. data[ ++ k] = L. data[ i] ;
}
L. length= k+ 1 ;
}
void Reverse ( SqList & L)
{
int temp;
for ( int i= 0 ; i< L. length/ 2 ; i++ )
{
temp = L. data[ i] ;
L. data[ i] = L. data[ L. length- 1 - i] ;
L. data[ L. length- 1 - i] = temp;
}
}
bool Merge ( SqList L1, SqList L2, SqList & L3)
{
if ( L1. length+ L2. length> L3. length)
return false;
int i= 0 , j= 0 , k= 0 ;
while ( i< L1. length&& j< L2. length)
{
if ( L1. data[ i] < L2. data[ j] )
L3. data[ k++ ] = L1. data[ i++ ] ;
else
L3. data[ k++ ] = L2. data[ j++ ] ;
}
while ( i< L1. length)
L3. data[ k++ ] = L1. data[ i++ ] ;
while ( j< L2. length)
L3. data[ k++ ] = L2. data[ j++ ] ;
L3. length= k;
return true;
}
4、动态线性表
# include "LineHead.h"
void InitSeqList ( SeqList & L)
{
L. data= ( int * ) malloc ( InitSize * sizeof ( int ) ) ;
L. length= 0 ;
L. maxsize= InitSize;
InitData ( L) ;
}
void InitData ( SeqList & L)
{
for ( int i= 0 ; i< L. maxsize; i++ )
{
L. data[ i] = 0 ;
}
L. length= 0 ;
}
void IncreaseSize ( SeqList & L, int len)
{
int * P = L. data;
L. data = ( int * ) malloc ( ( L. maxsize+ len) * sizeof ( int ) ) ;
for ( int i= 0 ; i< L. length; i++ )
{
L. data[ i] = P[ i] ;
}
L. maxsize= L. maxsize+ len;
free ( P) ;
InitData ( L) ;
}
void PrintSeqList ( SeqList & L)
{
for ( int i= 0 ; i< L. maxsize; i++ )
{
printf ( "%d\t" , L. data[ i] ) ;
}
}
5、随机函数
# include "LineHead.h"
int Random0_10 ( )
{
return rand ( ) % 10 ;
}
6、main方法
# include "LineHead.h"
int main ( )
{
SqList L;
printf ( "未初始化的静态线性表:\n" ) ;
InitPrintSqList ( L) ;
InitList ( L) ;
printf ( "\n初始化的静态线性表:\n" ) ;
InitPrintSqList ( L) ;
Voluation ( L) ;
printf ( "\n赋值后的静态线性表:\n" ) ;
PrintSqList ( L) ;
printf ( "\n删除最小元素后的静态线性表\n" ) ;
int value = 0 ;
bool a= Del_Min ( L, value) ;
printf ( "是否删除最小值%d:" , value) ;
if ( a)
printf ( "True" ) ;
else
printf ( "False" ) ;
printf ( "\n删除最小元素以后的静态线性表:\n" ) ;
PrintSqList ( L) ;
printf ( "\n逆序后的静态线性表:\n" ) ;
Reverse ( L) ;
PrintSqList ( L) ;
printf ( "\n删除顺序表中的特定值5:\n" ) ;
Del_x ( L, 5 ) ;
PrintSqList ( L) ;
SqList LOrder;
printf ( "\n给有序顺序表赋值:\n" ) ;
VoluationOrder ( LOrder) ;
PrintSqList ( LOrder) ;
bool a1 = Del_s_t ( LOrder, 5 , 7 ) ;
printf ( "\n是否删除5-7的值:\n" ) ;
if ( a1)
printf ( "True" ) ;
else
printf ( "False" ) ;
printf ( "\n删除有序顺序表5到7的值:\n" ) ;
PrintSqList ( LOrder) ;
bool a2 = Del_s_t2 ( L, 5 , 7 ) ;
printf ( "\n是否删除5-7的值:\n" ) ;
if ( a2)
printf ( "True" ) ;
else
printf ( "False" ) ;
printf ( "\n删除顺序表5到7的值:\n" ) ;
PrintSqList ( L) ;
SqList LOrder2;
Vol_Custom ( LOrder2) ;
printf ( "\n自定义有序顺序表:\n" ) ;
PrintSqList ( LOrder2) ;
printf ( "\n去掉有序顺序表中重复的值:\n" ) ;
Del_Same ( LOrder2) ;
PrintSqList ( LOrder2) ;
printf ( "\n\n有序顺序表1:\n" ) ;
PrintSqList ( LOrder) ;
printf ( "\n有序顺序表2:\n" ) ;
PrintSqList ( LOrder2) ;
SqList LOrder3;
int a3 = Merge ( LOrder, LOrder2, LOrder3) ;
printf ( "----%d------" , LOrder3. length) ;
printf ( "\n是否将两个有序顺序表合并:\n" ) ;
if ( a3)
printf ( "True" ) ;
else
printf ( "False" ) ;
printf ( "\n将两个有序顺序表合并:\n" ) ;
PrintSqList ( LOrder3) ;
SeqList L1;
printf ( "\n\n----------------------------------------------------------------------------------------\n" ) ;
printf ( "初始化的动态线性表:\n" ) ;
InitSeqList ( L1) ;
PrintSeqList ( L1) ;
printf ( "\n\n动态增加的动态线性表:\n" ) ;
IncreaseSize ( L1, 5 ) ;
PrintSeqList ( L1) ;
return 0 ;
}