数据结构
第四章 串
4.1 统计频数
# include <cstdio>
# include <iostream>
# include <string.h>
using namespace std;
void Count ( char s[ ] , int b[ ] )
{
for ( int i = 0 ; i < strlen ( s) ; i ++ )
{
if ( s[ i] >= '0' && s[ i] <= '9' )
b[ ( int ) s[ i] - ( int ) '0' ] += 1 ;
else
b[ 10 + ( int ) s[ i] - ( int ) 'A' ] += 1 ;
}
}
int main ( )
{ char s[ 255 ] ;
cin>> s;
int b[ 36 ] = { 0 } ;
Count ( s, b) ;
for ( int i = 0 ; i < 36 ; i ++ )
{
if ( b[ i] != 0 )
{
if ( i >= 0 && i <= 9 ) cout << i ;
else printf ( "%c" , 'A' + i - 10 ) ;
cout << ":" << b[ i] << endl;
}
}
return 0 ;
}
4.2 取子串
# include <cstdio>
# include <iostream>
using namespace std;
# define OK 1
# define ERROR 0
# define OVERFLOW - 1
typedef int Status;
# define MAXLEN 255
typedef struct {
char ch[ MAXLEN+ 1 ] ;
int length;
} SString;
void InputStr ( SString & s)
{
char str[ MAXLEN] ;
int i;
cin>> str;
for ( i= 0 ; str[ i] != '\0' ; i++ )
s. ch[ i+ 1 ] = str[ i] ;
s. length= i;
}
void OutputStr ( SString s)
{
for ( int i= 1 ; i<= s. length; i++ )
cout<< s. ch[ i] ;
}
Status SubString ( SString s, SString & sub, int pos, int len) {
if ( pos + len - 1 > s. length || pos <= 0 || len <= 0 || pos > s. length || len > s. length) return ERROR;
for ( int i = pos, j = 1 ; i < pos + len ; i ++ , j ++ )
sub. ch[ j] = s. ch[ i] ;
sub. length = len;
return OK;
}
int main ( )
{
SString s, sub;
int pos, len;
InputStr ( s) ;
cin>> pos;
cin>> len;
if ( SubString ( s, sub, pos, len) ) OutputStr ( sub) ;
else cout << "Error!" ;
return 0 ;
}
4.3 kmp
# include <iostream>
using namespace std;
# define MAXLEN 255
typedef struct {
char ch[ MAXLEN+ 1 ] ;
int length;
} SString;
void InputStr ( SString & s)
{
char str[ MAXLEN] ;
int i;
cin>> str;
for ( i= 0 ; str[ i] != '\0' ; i++ )
s. ch[ i+ 1 ] = str[ i] ;
s. length= i;
}
int Index_BF ( SString s, SString t)
{
for ( int i = 1 ; i <= s. length ; i ++ )
{
int flag = 1 ;
int x = i;
for ( int j = 1 ; j <= t. length ; j ++ )
{
if ( s. ch[ x++ ] != t. ch[ j] )
{
flag = 0 ;
break ;
}
}
if ( flag) return i;
}
return 0 ;
}
int main ( )
{
SString s, t;
InputStr ( s) ;
InputStr ( t) ;
cout<< Index_BF ( s, t) ;
return 0 ;
}
4.4 串的插入
# include <iostream>
using namespace std;
# define MAXLEN 255
typedef struct {
char ch[ MAXLEN+ 1 ] ;
int length;
} SString;
void InputStr ( SString & s)
{
char str[ MAXLEN] ;
int i;
cin>> str;
for ( i= 0 ; str[ i] != '\0' ; i++ )
s. ch[ i+ 1 ] = str[ i] ;
s. length= i;
}
void OutputStr ( SString s)
{
for ( int i= 1 ; i<= s. length; i++ )
cout<< s. ch[ i] ;
}
void InsertStr ( SString & s, int pos, SString t)
{
if ( pos <= 0 || pos > s. length + 1 || s. length + t. length > MAXLEN || pos + t. length > MAXLEN) return ;
for ( int i = s. length , j = s. length + t. length ; i >= pos ; j-- , i-- )
{
s. ch[ j] = s. ch[ i] ;
}
for ( int i = pos, j = 1 ; i < pos + t. length ; j++ , i++ )
{
s. ch[ i] = t. ch[ j] ;
}
s. length = s. length + t. length;
return ;
}
int main ( )
{
SString s, t;
int pos;
InputStr ( s) ;
cin>> pos;
InputStr ( t) ;
InsertStr ( s, pos, t) ;
OutputStr ( s) ;
return 0 ;
}
第五章 二叉树
5.1 二叉树的建立和遍历
# include <iostream>
# include <string.h>
using namespace std;
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
void CreateBiTree ( BiTree & T)
{
char ch;
cin >> ch;
if ( ch == '#' ) T = NULL ;
else {
T = new BiTNode;
T-> data = ch;
CreateBiTree ( T-> lchild) ;
CreateBiTree ( T-> rchild) ;
}
return ;
}
void PreOrderTraverse ( BiTree T)
{
if ( T) {
cout << T-> data ;
PreOrderTraverse ( T-> lchild) ;
PreOrderTraverse ( T-> rchild) ;
}
}
void InOrderTraverse ( BiTree T)
{
if ( T) {
InOrderTraverse ( T-> lchild) ;
cout << T-> data ;
InOrderTraverse ( T-> rchild) ;
}
}
void PostOrderTraverse ( BiTree T)
{
if ( T) {
PostOrderTraverse ( T-> lchild) ;
PostOrderTraverse ( T-> rchild) ;
cout << T-> data ;
}
}
int main ( )
{
BiTree T;
CreateBiTree ( T) ;
PreOrderTraverse ( T) ;
cout<< endl;
InOrderTraverse ( T) ;
cout<< endl;
PostOrderTraverse ( T) ;
cout<< endl;
return 0 ;
}
5.2 统计分支个数
# include <iostream>
# include <string.h>
using namespace std;
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
void CreateBiTree ( BiTree & T)
{
ElemType ch;
cin>> ch;
if ( ch== '#' )
T= NULL ;
else
{
T= new BiTNode;
T-> data= ch;
CreateBiTree ( T-> lchild) ;
CreateBiTree ( T-> rchild) ;
}
}
int Count_leaf ( BiTree T) {
if ( ! T) return 0 ;
else return Count_leaf ( T-> lchild) + Count_leaf ( T-> rchild) + ( ( ( ! T-> lchild) && ( ! T-> rchild) ) ? 1 : 0 ) ;
}
int Count_Sigle ( BiTree T) {
if ( ! T) return 0 ;
return Count_Sigle ( T-> lchild) + Count_Sigle ( T-> rchild) + ( ( ( ! T-> lchild) && ( T-> rchild) ) || ( ( T-> lchild) && ( ! T-> rchild) ) ? 1 : 0 ) ;
}
int Count_Double ( BiTree T) {
if ( ! T) return 0 ;
return Count_Double ( T-> lchild) + Count_Double ( T-> rchild) + ( ( ( T-> lchild) && ( T-> rchild) ) ? 1 : 0 ) ;
}
int main ( )
{
BiTree T;
CreateBiTree ( T) ;
cout<< Count_leaf ( T) << " " << Count_Sigle ( T) << " " << Count_Double ( T) << endl;
return 0 ;
}
5.3 高度计算
# include <iostream>
# include <string.h>
using namespace std;
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
void CreateBiTree ( BiTree & T)
{
ElemType ch;
cin>> ch;
if ( ch== '#' )
T= NULL ;
else
{
T= new BiTNode;
T-> data= ch;
CreateBiTree ( T-> lchild) ;
CreateBiTree ( T-> rchild) ;
}
}
int Depth ( BiTree T)
{
if ( ! T) return 0 ;
else {
int m = Depth ( T-> lchild) ;
int n = Depth ( T-> rchild) ;
return m > n ? ( m+ 1 ) : ( n+ 1 ) ;
}
}
int main ( )
{
BiTree T;
CreateBiTree ( T) ;
cout<< Depth ( T) << endl;
return 0 ;
}
5.4 二叉树左右孩子交换
# include <iostream>
# include <cstring>
using namespace std;
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
void CreateBiTree ( BiTree & T)
{
ElemType ch;
cin>> ch;
if ( ch== '#' )
T= NULL ;
else
{
T= new BiTNode;
T-> data= ch;
CreateBiTree ( T-> lchild) ;
CreateBiTree ( T-> rchild) ;
}
}
void ChangeRL ( BiTree & T)
{
BiTree t;
if ( ! T) return ;
else {
t = T-> lchild;
T-> lchild = T-> rchild;
T-> rchild = t;
ChangeRL ( T-> lchild) ;
ChangeRL ( T-> rchild) ;
}
}
void PreOrderTraverse ( BiTree T)
{
if ( T)
{
cout<< T-> data;
PreOrderTraverse ( T-> lchild) ;
PreOrderTraverse ( T-> rchild) ;
}
}
int main ( )
{
BiTree T;
CreateBiTree ( T) ;
ChangeRL ( T) ;
PreOrderTraverse ( T) ;
cout<< endl;
return 0 ;
}
5.5 两个二叉树的相等判断
# include <iostream>
using namespace std;
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
void CreateBiTree ( BiTree & T)
{
ElemType ch;
cin>> ch;
if ( ch== '#' )
T= NULL ;
else
{
T= new BiTNode;
T-> data= ch;
CreateBiTree ( T-> lchild) ;
CreateBiTree ( T-> rchild) ;
}
}
int Compare ( BiTree T1, BiTree T2)
{
if ( ! T1 && ! T2) return true;
if ( ! T1 || ! T2) return false;
return T1-> data == T2-> data && Compare ( T1-> rchild, T2-> rchild) && Compare ( T1-> lchild, T2-> lchild) ;
}
int main ( )
{
BiTree T1, T2;
CreateBiTree ( T1) ;
CreateBiTree ( T2) ;
if ( ! Compare ( T1, T2) )
cout<< "NO" << endl;
else
cout<< "YES" << endl;
return 0 ;
}
5.6 二叉树的层次遍历
# include <iostream>
# include <string.h>
using namespace std;
int flag;
# define OK 1
# define ERROR - 1
# define TRUE 1
# define FALSE 0
typedef int Status;
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
typedef BiTree QElemType;
typedef struct QNode {
QElemType data;
struct QNode * next;
} QNode, * QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
} LinkQueue;
Status InitQueue ( LinkQueue & Q) {
Q. front= Q. rear= new QNode;
if ( ! Q. front) return ERROR;
Q. front-> next= NULL ;
return OK;
}
Status QueueEmpty ( LinkQueue Q) {
if ( Q. front== Q. rear)
return TRUE;
return FALSE;
}
Status EnQueue ( LinkQueue & Q, QElemType e) {
QueuePtr p;
p= new QNode;
if ( ! p) return ERROR;
p-> data= e;
p-> next= NULL ;
Q. rear-> next= p;
Q. rear= p;
return OK;
}
Status DeQueue ( LinkQueue & Q, QElemType & e) {
QueuePtr p;
if ( Q. front== Q. rear)
return ERROR;
p= Q. front-> next;
e= p-> data;
Q. front-> next= p-> next;
if ( Q. rear== p)
Q. rear= Q. front;
delete p;
return OK;
}
void CreateBiTree ( BiTree & T)
{
ElemType ch;
cin>> ch;
if ( ch== '#' )
T= NULL ;
else
{
T= new BiTNode;
T-> data= ch;
CreateBiTree ( T-> lchild) ;
CreateBiTree ( T-> rchild) ;
}
}
Status LevelOrder ( BiTree T)
{
LinkQueue Q;
QElemType t;
InitQueue ( Q) ;
if ( T) {
EnQueue ( Q, T) ;
while ( ! QueueEmpty ( Q) ) {
DeQueue ( Q, t) ;
cout << t-> data;
if ( t-> lchild) EnQueue ( Q, t-> lchild) ;
if ( t-> rchild) EnQueue ( Q, t-> rchild) ;
}
}
}
int main ( )
{
BiTree T;
CreateBiTree ( T) ;
LevelOrder ( T) ;
cout<< endl;
return 0 ;
}
5.7 二叉树的WPL计算
# include <iostream>
using namespace std;
typedef struct BiTNode
{
int weight;
struct BiTNode * left, * right;
} BiTNode, * BiTree;
void CreateBiTree ( BiTree & T)
{
int x;
cin>> x;
if ( x == 0 ) T= NULL ;
else
{
T= new BiTNode;
T-> weight= x;
CreateBiTree ( T-> left) ;
CreateBiTree ( T-> right) ;
}
}
int WPL ( BiTree & T, int d)
{
if ( ! T) return 0 ;
return ( ( ! T-> left) && ( ! T-> right) ? T-> weight* d: 0 ) + WPL ( T-> right, d+ 1 ) + WPL ( T-> left, d+ 1 ) ;
}
int main ( )
{
while ( 1 )
{
BiTree T;
CreateBiTree ( T) ;
if ( ! T) break ;
int d= 0 ;
cout<< WPL ( T, d) << endl;
}
return 0 ;
}
第六章 图
6.1 邻接矩阵
6.1.1 建立无向网的邻接矩阵
# include <cstdio>
# include <iostream>
using namespace std;
# define MaxInt 32767
# define MVNum 20
typedef struct {
int vexnum, arcnum;
char vexs[ MVNum] ;
int arcs[ MVNum] [ MVNum] ;
} AMGraph;
int LovateVex ( AMGraph G, char v) {
int i;
for ( i= 0 ; i< G. vexnum; i++ )
if ( G. vexs[ i] == v) return i;
return - 1 ;
}
void CreateUDN ( AMGraph & G)
{
cin >> G. vexnum >> G. arcnum;
for ( int i = 0 ; i < G. vexnum ; i++ )
cin >> G. vexs[ i] ;
for ( int i = 0 ; i < G. vexnum ; i++ )
for ( int j = 0 ; j < G. vexnum ; j++ )
G. arcs[ i] [ j] = ( i == j ? 0 : MaxInt) ;
for ( int k = 0 ; k < G. arcnum ; k++ ) {
char v1, v2;
int w;
cin >> v1 >> v2 >> w;
int i = LovateVex ( G, v1) , j = LovateVex ( G, v2) ;
G. arcs[ i] [ j] = w;
G. arcs[ j] [ i] = w;
}
}
void PrintGraph ( AMGraph G)
{
cout<< "图的邻接矩阵:" ;
for ( int i= 0 ; i< G. vexnum; i++ )
{ cout<< endl;
for ( int j= 0 ; j< G. vexnum; j++ ) {
if ( G. arcs[ i] [ j] == MaxInt)
printf ( " ∞" ) ;
else
printf ( "%5d" , G. arcs[ i] [ j] ) ;
}
}
}
int main ( )
{
AMGraph G;
CreateUDN ( G) ;
PrintGraph ( G) ;
return 0 ;
}
6.1.2 深度优先遍历
# include <iostream>
using namespace std;
# define MaxInt 32767
# define MVNum 20
typedef struct {
int vexnum, arcnum;
char vexs[ MVNum] ;
int arcs[ MVNum] [ MVNum] ;
} AMGraph;
int LocateVex ( AMGraph G, char v) {
int i;
for ( i= 0 ; i< G. vexnum; i++ )
if ( G. vexs[ i] == v) return i;
return - 1 ;
}
void CreateDG ( AMGraph & G)
{
cin >> G. vexnum >> G. arcnum;
for ( int i = 0 ; i < G. vexnum ; i++ )
cin >> G. vexs[ i] ;
for ( int i = 0 ; i < G. vexnum ; i++ )
for ( int j = 0 ; j < G. vexnum ; j++ )
G. arcs[ i] [ j] = 0 ;
for ( int k = 0 ; k < G. arcnum ; k++ ) {
char v1, v2;
cin >> v1 >> v2;
int i = LocateVex ( G, v1) , j = LocateVex ( G, v2) ;
G. arcs[ i] [ j] = 1 ;
}
}
void PrintGraph ( AMGraph G)
{
cout<< "有向图的邻接矩阵:" ;
for ( int i= 0 ; i< G. vexnum; i++ )
{ cout<< endl;
for ( int j= 0 ; j< G. vexnum; j++ )
{
printf ( "%5d" , G. arcs[ i] [ j] ) ;
}
}
}
bool visited[ MVNum] ;
void DFS ( AMGraph G, int v)
{
cout << " " << G. vexs[ v] ;
visited[ v] = true;
for ( int i = 0 ; i < G. vexnum ; i ++ )
{
if ( ! visited[ i] && G. arcs[ v] [ i] != 0 ) DFS ( G, i) ;
}
}
void DFSTraverse ( AMGraph G)
{
for ( int v = 0 ; v < G. vexnum ; v++ ) visited[ v] = false;
for ( int v = 0 ; v < G. vexnum ; v ++ )
if ( ! visited[ v] ) {
DFS ( G, v) ;
cout << endl;
}
}
int main ( )
{
AMGraph G;
CreateDG ( G) ;
PrintGraph ( G) ;
cout<< "\n图的深度优先序列:\n" ;
DFSTraverse ( G) ;
return 0 ;
}
6.1.3 prime求最小生成树
# include <cstdio>
# include <iostream>
using namespace std;
# include "graph.h"
typedef struct {
char adjvex;
int lowcost;
} node;
node closedge[ MVNum] ;
int Min ( AMGraph G)
{
int k = 0 ;
while ( closedge[ k] . lowcost == 0 )
k++ ;
int min = closedge[ k] . lowcost;
for ( int i = k + 1 ; i < G. vexnum; i++ )
{
if ( closedge[ i] . lowcost != 0 && closedge[ i] . lowcost < min)
{
min = closedge[ i] . lowcost;
k = i;
}
}
return k;
}
int MiniSpanTree ( AMGraph G, char u)
{
int uIndex = LocateVex ( G, u) ;
for ( int i = 0 ; i < G. vexnum; i++ )
{
if ( i != uIndex)
{
closedge[ i] . adjvex = u;
closedge[ i] . lowcost = G. arcs[ uIndex] [ i] ;
}
}
closedge[ uIndex] . lowcost = 0 ;
cout << endl;
int MSTcost = 0 ;
for ( int i = 1 ; i < G. vexnum; i++ )
{
int k = Min ( G) ;
cout << "(" << closedge[ k] . adjvex << "," << G. vexs[ k] << ") " << closedge[ k] . lowcost << endl;
MSTcost += closedge[ k] . lowcost;
closedge[ k] . lowcost = 0 ;
for ( int j = 0 ; j < G. vexnum; j++ )
{
if ( G. arcs[ k] [ j] < closedge[ j] . lowcost)
{
closedge[ j] . adjvex = G. vexs[ k] ;
closedge[ j] . lowcost = G. arcs[ k] [ j] ;
}
}
}
return MSTcost;
}
int main ( )
{
AMGraph G;
char u;
int MSTcost;
CreateUDN ( G) ;
cin>> u;
PrintGraph ( G) ;
cout<< "\n\n最小生成树的边:" ;
MSTcost= MiniSpanTree ( G, u) ;
cout<< "\n最小生成树的代价:\n" << MSTcost;
return 0 ;
}
6.1.4 Dijkstra算法求解单源点最短路径
# include <bits/stdc++.h>
using namespace std;
# include "graph.h"
void ShortestPath_DIJ ( AMGraph G, int v0) {
vector< int > dist ( G. vexnum, MaxInt) ;
vector< bool> visited ( G. vexnum, false) ;
dist[ v0] = 0 ;
for ( int i = 0 ; i < G. vexnum; ++ i) {
int u = - 1 ;
for ( int j = 0 ; j < G. vexnum; ++ j) {
if ( ! visited[ j] && ( u == - 1 || dist[ j] < dist[ u] ) ) {
u = j;
}
}
visited[ u] = true;
for ( int v = 0 ; v < G. vexnum; ++ v) {
if ( ! visited[ v] && G. arcs[ u] [ v] != MaxInt) {
if ( dist[ u] + G. arcs[ u] [ v] < dist[ v] ) {
dist[ v] = dist[ u] + G. arcs[ u] [ v] ;
}
}
}
}
vector< tuple< int , int , int >> paths;
for ( int i = 0 ; i < G. vexnum; ++ i) {
if ( i != v0 && dist[ i] != MaxInt) {
paths. push_back ( make_tuple ( v0, i, dist[ i] ) ) ;
}
}
sort ( paths. begin ( ) , paths. end ( ) , [ & ] ( const tuple< int , int , int > & a, const tuple< int , int , int > & b) {
return get< 2 > ( a) < get< 2 > ( b) ;
} ) ;
for ( const auto & path : paths) {
cout << G. vexs[ get< 0 > ( path) ] << "-->" << G. vexs[ get< 1 > ( path) ] << " " << get< 2 > ( path) << endl;
}
}
int main ( )
{
AMGraph G;
char u;
CreateDN ( G) ;
cin>> u;
PrintGraph ( G) ;
int v0= LocateVex ( G, u) ;
cout<< "\n从顶点" << u<< "到图中其他顶点的最短路径:\n" ;
ShortestPath_DIJ ( G, v0) ;
return 0 ;
}
6.2 邻接表
6.2.1 图的建立
# include <cstdio>
# include <iostream>
using namespace std;
# define MVNum 20
typedef struct ArcNode {
int adjvex;
struct ArcNode * nextarc;
} ArcNode;
typedef struct VNode {
char data;
ArcNode * firstarc;
} VNode;
typedef struct {
int vexnum;
int arcnum;
VNode vertices[ MVNum] ;
} ALGraph;
int LocateVex ( ALGraph G, char v)
{
for ( int i= 0 ; i< G. vexnum ; i++ )
if ( G. vertices[ i] . data== v ) return i;
return - 1 ;
}
void CreateUDG ( ALGraph & G)
{
int i, j, k;
char v1, v2;
ArcNode * p, * q;
cin >> G. vexnum >> G. arcnum;
for ( i = 0 ; i < G. vexnum ; i ++ )
{
cin >> G. vertices[ i] . data;
G. vertices[ i] . firstarc = NULL ;
}
for ( k = 0 ; k < G. arcnum ; k ++ )
{
cin >> v1 >> v2;
i = LocateVex ( G, v1) ;
j = LocateVex ( G, v2) ;
p = new ArcNode;
p-> adjvex = j;
p-> nextarc = G. vertices[ i] . firstarc;
G. vertices[ i] . firstarc = p;
q = new ArcNode;
q-> adjvex = i;
q-> nextarc = G. vertices[ j] . firstarc;
G. vertices[ j] . firstarc = q;
}
}
void PrintGraph ( ALGraph G)
{
ArcNode * p;
for ( int i= 0 ; i< G. vexnum; i++ )
{
printf ( "\n%2c邻接到:" , G. vertices[ i] . data) ;
for ( p= G. vertices[ i] . firstarc; p ; p= p-> nextarc)
{
int j= p-> adjvex;
printf ( "%2c" , G. vertices[ j] . data) ;
}
}
}
int main ( )
{ ALGraph G;
CreateUDG ( G) ;
PrintGraph ( G) ;
return 0 ;
}
6.2.2 计算顶点的出度和入度
# include <cstdio>
# include <iostream>
using namespace std;
# define MVNum 20
typedef struct ArcNode {
int adjvex;
struct ArcNode * nextarc;
} ArcNode;
typedef struct VNode {
char data;
ArcNode * firstarc;
} VNode;
typedef struct {
int vexnum;
int arcnum;
VNode vertices[ MVNum] ;
} ALGraph;
int LocateVex ( ALGraph G, char v)
{
for ( int i= 0 ; i< G. vexnum ; i++ )
if ( G. vertices[ i] . data== v ) return i;
return - 1 ;
}
void CreateDG ( ALGraph & G)
{
int i, j, k;
char v1, v2;
ArcNode * p;
cin>> G. vexnum>> G. arcnum;
for ( i= 0 ; i< G. vexnum; i++ )
{
cin>> G. vertices[ i] . data;
G. vertices[ i] . firstarc= NULL ;
}
for ( k= 0 ; k< G. arcnum; k++ )
{
cin>> v1>> v2;
i= LocateVex ( G, v1) ;
j= LocateVex ( G, v2) ;
p= new ArcNode;
p-> adjvex= j;
p-> nextarc= G. vertices[ i] . firstarc;
G. vertices[ i] . firstarc= p;
}
}
void PrintGraph ( ALGraph G)
{
ArcNode * p;
for ( int i= 0 ; i< G. vexnum; i++ )
{
printf ( "\n%2c邻接到:" , G. vertices[ i] . data) ;
for ( p= G. vertices[ i] . firstarc; p ; p= p-> nextarc)
{
int j= p-> adjvex;
printf ( "%2c" , G. vertices[ j] . data) ;
}
}
}
void FindOutdegree ( ALGraph G, int outdegree[ ] )
{
for ( int i = 0 ; i < G. vexnum ; i++ ) {
outdegree[ i] = 0 ;
ArcNode * p = G. vertices[ i] . firstarc;
while ( p) {
outdegree[ i] ++ ;
p = p-> nextarc;
}
}
}
void FindIndegree ( ALGraph G, int indegree[ ] )
{
for ( int i = 0 ; i < G. vexnum ; i++ ) {
indegree[ i] = 0 ;
for ( int j = 0 ; j < G. vexnum ; j++ )
{
ArcNode * p = G. vertices[ j] . firstarc;
while ( p) {
if ( p-> adjvex == i) {
indegree[ i] ++ ;
break ;
}
p = p-> nextarc;
}
}
}
}
int main ( )
{ ALGraph G;
int indegree[ MVNum] , outdegree[ MVNum] ;
CreateDG ( G) ;
PrintGraph ( G) ;
FindOutdegree ( G, outdegree) ;
cout<< "\n 顶点的出度:" ;
for ( int i= 0 ; i< G. vexnum; i++ )
printf ( "%2d" , outdegree[ i] ) ;
FindIndegree ( G, indegree) ;
cout<< "\n 顶点的入度:" ;
for ( int i= 0 ; i< G. vexnum; i++ )
printf ( "%2d" , indegree[ i] ) ;
return 0 ;
}
6.2.3 图的广度优先遍历
# include <cstdio>
# include <iostream>
using namespace std;
# define OK 1
# define ERROR 0
# define OVERFLOW - 1
typedef int Status;
typedef int QElemType;
# define MAX_QSIZE 5
struct SqQueue
{
QElemType * base;
int front;
int rear;
} ;
Status InitQueue ( SqQueue & Q)
{
Q. base = new QElemType[ MAX_QSIZE] ;
if ( ! Q. base) return ERROR;
Q. front = Q. rear = 0 ;
return OK;
}
Status QueueEmpty ( SqQueue Q)
{
return ( Q. front == Q. rear) ;
}
Status EnQueue ( SqQueue & Q, QElemType e)
{
if ( ( Q. rear+ 1 ) % MAX_QSIZE == Q. front) return ERROR;
Q. base[ Q. rear] = e;
Q. rear = ( Q. rear + 1 ) % MAX_QSIZE;
return OK;
}
Status DeQueue ( SqQueue & Q, QElemType & e)
{
if ( Q. front == Q. rear) return ERROR;
e = Q. base[ Q. front] ;
Q. front = ( Q. front+ 1 ) % MAX_QSIZE;
}
# define MVNum 20
typedef struct ArcNode {
int adjvex;
struct ArcNode * nextarc;
} ArcNode;
typedef struct VNode {
char data;
ArcNode * firstarc;
} VNode;
typedef struct {
int vexnum;
int arcnum;
VNode vertices[ MVNum] ;
} ALGraph;
int LocateVex ( ALGraph G, char v)
{
for ( int i= 0 ; i< G. vexnum ; i++ )
if ( G. vertices[ i] . data== v ) return i;
return - 1 ;
}
void CreateUDG ( ALGraph & G)
{
int i, j, k;
char v1, v2;
ArcNode * p, * q;
cin>> G. vexnum>> G. arcnum;
for ( i= 0 ; i< G. vexnum; i++ )
{
cin>> G. vertices[ i] . data;
G. vertices[ i] . firstarc= NULL ;
}
for ( k= 0 ; k< G. arcnum; k++ )
{
cin>> v1>> v2;
i= LocateVex ( G, v1) ;
j= LocateVex ( G, v2) ;
p= new ArcNode;
p-> adjvex= j;
p-> nextarc= G. vertices[ i] . firstarc;
G. vertices[ i] . firstarc= p;
q= new ArcNode;
q-> adjvex= i;
q-> nextarc= G. vertices[ j] . firstarc;
G. vertices[ j] . firstarc= q;
}
}
void PrintGraph ( ALGraph G)
{
ArcNode * p;
for ( int i= 0 ; i< G. vexnum; i++ )
{
printf ( "\n%2c邻接到:" , G. vertices[ i] . data) ;
for ( p= G. vertices[ i] . firstarc; p ; p= p-> nextarc)
{
int j= p-> adjvex;
printf ( "%2c" , G. vertices[ j] . data) ;
}
}
}
bool visited[ MVNum] ;
void BFS ( ALGraph G, int v)
{
SqQueue Q;
InitQueue ( Q) ;
cout << ' ' << G. vertices[ v] . data;
EnQueue ( Q, v) ;
visited[ v] = true;
while ( ! QueueEmpty ( Q) ) {
DeQueue ( Q, v) ;
ArcNode * p = G. vertices[ v] . firstarc;
while ( p) {
int u = p-> adjvex;
if ( ! visited[ u] ) {
cout << ' ' << G. vertices[ u] . data;
visited[ u] = true;
EnQueue ( Q, u) ;
}
p = p-> nextarc;
}
}
}
void BFSTraverse ( ALGraph G) {
int v;
for ( v= 0 ; v< G. vexnum; v++ )
visited[ v] = false;
for ( v= 0 ; v< G. vexnum; v++ )
{
if ( ! visited[ v] )
{
cout<< endl;
BFS ( G, v) ;
}
}
}
int main ( )
{ ALGraph G;
CreateUDG ( G) ;
PrintGraph ( G) ;
cout<< "\n 图的广度优先序列:" ;
BFSTraverse ( G) ;
return 0 ;
}
6.2.4 AOV网的拓扑排序
# include <cstdio>
# include <iostream>
using namespace std;
# define OK 1
# define ERROR 0
# define OVERFLOW - 1
typedef int Status;
# include "stack.h"
# include "graph.h"
void FindIndegree ( ALGraph G, int indegree[ ] )
{
for ( int i = 0 ; i < G. vexnum; i++ )
indegree[ i] = 0 ;
for ( int i = 0 ; i < G. vexnum; i++ )
{
ArcNode * p = G. vertices[ i] . firstarc;
while ( p)
{
int j = p-> adjvex;
indegree[ j] ++ ;
p = p-> nextarc;
}
}
}
Status TopologicalSort ( ALGraph G, int topo[ ] )
{
int indegree[ MVNum] ;
SqStack S;
InitStack ( S) ;
FindIndegree ( G, indegree) ;
for ( int i = 0 ; i < G. vexnum; i++ )
{
if ( indegree[ i] == 0 )
{
Push ( S, i) ;
}
}
int count = 0 ;
while ( ! StackEmpty ( S) )
{
Pop ( S, topo[ count++ ] ) ;
ArcNode * p = G. vertices[ topo[ count - 1 ] ] . firstarc;
while ( p)
{
indegree[ p-> adjvex] -- ;
if ( indegree[ p-> adjvex] == 0 )
{
Push ( S, p-> adjvex) ;
}
p = p-> nextarc;
}
}
if ( count != G. vexnum)
{
return ERROR;
}
return OK;
}
int main ( )
{ ALGraph G;
int topo[ MVNum] ;
CreateDG ( G) ;
PrintGraph ( G) ;
if ( TopologicalSort ( G, topo) == ERROR)
cout<< "\n 图中有环,拓扑排序失败!" ;
else {
cout<< "\n 拓扑序列:" ;
for ( int i= 0 ; i< G. vexnum; i++ )
printf ( "%2c" , G. vertices[ topo[ i] ] . data) ;
}
return 0 ;
}
第七章 查找
7.1 顺序查找
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct
{
RedType r[ MAXSIZE+ 1 ] ;
int length;
} SSTable;
void SSTableInput ( SSTable & L) ;
void SSTableOutput ( SSTable L) ;
int Search_Seq ( SSTable L, KeyType key) ;
int Search_Seq ( SSTable L, KeyType key)
{
for ( int i = 1 ; i <= L. length; i++ ) {
if ( L. r[ i] . key == key) {
return i;
}
}
return 0 ;
}
void SSTableInput ( SSTable & L)
{
int i= 1 ; KeyType x;
scanf ( "%d" , & x) ;
while ( x!= - 1 )
{
L. r[ i++ ] . key= x; scanf ( "%d" , & x) ;
}
L. length= i- 1 ;
}
void SSTableOutput ( SSTable L)
{
int i;
for ( i= 1 ; i<= L. length; i++ )
printf ( "%d " , L. r[ i] . key) ;
printf ( "\n" ) ;
}
int main ( )
{
SSTable L; KeyType x; int loc;
SSTableInput ( L) ;
scanf ( "%d" , & x) ;
SSTableOutput ( L) ;
loc= Search_Seq ( L, x) ;
if ( loc== 0 ) printf ( "not find!\n" ) ;
else printf ( "%d\n" , loc) ;
return 0 ;
}
7.2 折半查找
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct
{
RedType r[ MAXSIZE+ 1 ] ;
int length;
} SSTable;
void SSTableInput ( SSTable & L) ;
void SSTableOutput ( SSTable L) ;
int Search_Bin ( SSTable L, KeyType key) ;
int Search_Bin ( SSTable L, KeyType key)
{
int low = 1 ;
int high = L. length;
while ( low <= high) {
int mid = ( low + high) / 2 ;
if ( L. r[ mid] . key == key) {
return mid;
} else if ( L. r[ mid] . key < key) {
low = mid + 1 ;
} else {
high = mid - 1 ;
}
}
return 0 ;
}
void SSTableInput ( SSTable & L)
{
int i= 1 ; KeyType x;
scanf ( "%d" , & x) ;
while ( x!= - 1 )
{
L. r[ i++ ] . key= x; scanf ( "%d" , & x) ;
}
L. length= i- 1 ;
}
void SSTableOutput ( SSTable L)
{
int i;
for ( i= 1 ; i<= L. length; i++ )
printf ( "%d " , L. r[ i] . key) ;
printf ( "\n" ) ;
}
int main ( )
{
SSTable L; KeyType x; int loc;
SSTableInput ( L) ;
scanf ( "%d" , & x) ;
SSTableOutput ( L) ;
loc= Search_Bin ( L, x) ;
if ( loc== 0 ) printf ( "not find!\n" ) ;
else printf ( "%d\n" , loc) ;
return 0 ;
}
7.3 二叉排序树的查找
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct BiTNode
{
RedType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
BiTree Search_BST ( BiTree T, KeyType key, BiTree & parent) ;
void Insert_BST ( BiTree & T, RedType r) ;
void Create_BST ( BiTree & T) ;
void PreOrder ( BiTree bt) ;
void InOrder ( BiTree bt) ;
BiTree Search_BST ( BiTree T, KeyType key, BiTree & parent)
{
BiTree p = T;
parent = NULL ;
while ( p != NULL && p-> data. key != key)
{
parent = p;
if ( key < p-> data. key)
p = p-> lchild;
else
p = p-> rchild;
}
return p;
}
void Insert_BST ( BiTree & T, RedType r)
{
BiTree p, q, parent;
parent= NULL ;
p= Search_BST ( T, r. key, parent) ;
if ( p) printf ( "BST中有结点r,无需插入\n" ) ;
else
{
p= parent;
q= ( BiTNode * ) malloc ( sizeof ( BiTNode) ) ; q-> data= r; q-> lchild= q-> rchild= NULL ;
if ( T== NULL ) T= q;
else if ( r. key< p-> data. key) p-> lchild= q;
else p-> rchild= q;
}
}
void Create_BST ( BiTree & T )
{
RedType r;
T= NULL ;
scanf ( "%d" , & r. key) ;
while ( r. key!= - 1 )
{
Insert_BST ( T, r) ;
scanf ( "%d" , & r. key) ;
}
}
void PreOrder ( BiTree bt)
{
if ( bt)
{
printf ( "%d " , bt-> data. key) ;
PreOrder ( bt-> lchild) ;
PreOrder ( bt-> rchild) ;
}
}
void InOrder ( BiTree bt)
{
if ( bt)
{
InOrder ( bt-> lchild) ;
printf ( "%d " , bt-> data. key) ;
InOrder ( bt-> rchild) ;
}
}
int main ( )
{
BiTree T; KeyType x; BiTree parent, loc;
Create_BST ( T) ;
scanf ( "%d" , & x) ;
printf ( "PreOrder:" ) ;
PreOrder ( T) ; printf ( "\n" ) ;
printf ( "InOrder:" ) ;
InOrder ( T) ; printf ( "\n" ) ;
loc= Search_BST ( T, x, parent) ;
if ( loc== NULL ) printf ( "not find!\n" ) ;
else printf ( "%d\n" , parent-> data. key) ;
return 0 ;
}
第八章 排序
8.1 直接插入排序
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct
{
RedType r[ MAXSIZE+ 1 ] ;
int length;
} SeqList;
void SeqListInput ( SeqList & L) ;
void SeqListOutput ( SeqList L) ;
void InsertSort ( SeqList & L) ;
void ShellInsert ( SeqList & L, int d) ;
void ShellSort ( SeqList & L) ;
void QuickSort ( SeqList & L, int low, int high) ;
void HeapAdjust ( SeqList & L, int low, int high) ;
void HeapSort ( SeqList & L) ;
void InsertSort ( SeqList & L)
{
int i, j;
for ( i = 2 ; i <= L. length; i++ )
{
RedType temp = L. r[ i] ;
j = i - 1 ;
while ( j > 0 && temp. key < L. r[ j] . key)
{
L. r[ j + 1 ] = L. r[ j] ;
j-- ;
}
L. r[ j + 1 ] = temp;
if ( i <= 4 )
for ( int k = 1 ; k <= L. length; k++ )
{
printf ( "%d " , L. r[ k] . key) ;
}
if ( i <= 4 ) printf ( "\n" ) ;
}
}
void SeqListInput ( SeqList & L)
{
int i= 1 ; KeyType x;
scanf ( "%d" , & x) ;
while ( x!= - 1 )
{
L. r[ i++ ] . key= x; scanf ( "%d" , & x) ;
}
L. length= i- 1 ;
}
void SeqListOutput ( SeqList L)
{
int i;
for ( i= 1 ; i<= L. length; i++ )
printf ( "%d " , L. r[ i] . key) ;
printf ( "\n" ) ;
}
int main ( )
{
SeqList L;
SeqListInput ( L) ;
InsertSort ( L) ;
SeqListOutput ( L) ;
return 0 ;
}
8.2 希尔排序
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct
{
RedType r[ MAXSIZE+ 1 ] ;
int length;
} SeqList;
void SeqListInput ( SeqList & L) ;
void SeqListOutput ( SeqList L) ;
void InsertSort ( SeqList & L) ;
void ShellInsert ( SeqList & L, int d) ;
void ShellSort ( SeqList & L) ;
void QuickSort ( SeqList & L, int low, int high) ;
void HeapAdjust ( SeqList & L, int low, int high) ;
void HeapSort ( SeqList & L) ;
void ShellInsert ( SeqList & L, int d)
{
for ( int i = d + 1 ; i <= L. length; i++ )
{
if ( L. r[ i] . key < L. r[ i - d] . key)
{
L. r[ 0 ] = L. r[ i] ;
int j;
for ( j = i - d; j > 0 && L. r[ 0 ] . key < L. r[ j] . key; j -= d)
{
L. r[ j + d] = L. r[ j] ;
}
L. r[ j + d] = L. r[ 0 ] ;
}
}
}
void ShellSort ( SeqList & L)
{
int d;
d= L. length/ 2 ;
while ( d!= 0 )
{
ShellInsert ( L, d) ; d= d/ 2 ;
}
}
void SeqListInput ( SeqList & L)
{
int i= 1 ; KeyType x;
scanf ( "%d" , & x) ;
while ( x!= - 1 )
{
L. r[ i++ ] . key= x; scanf ( "%d" , & x) ;
}
L. length= i- 1 ;
}
void SeqListOutput ( SeqList L)
{
int i;
for ( i= 1 ; i<= L. length; i++ )
printf ( "%d " , L. r[ i] . key) ;
printf ( "\n" ) ;
}
int main ( )
{
SeqList L;
SeqListInput ( L) ;
SeqListOutput ( L) ;
ShellSort ( L) ;
SeqListOutput ( L) ;
return 0 ;
}
8.3 快速排序
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct
{
RedType r[ MAXSIZE+ 1 ] ;
int length;
} SeqList;
void SeqListInput ( SeqList & L) ;
void SeqListOutput ( SeqList L) ;
void InsertSort ( SeqList & L) ;
void ShellInsert ( SeqList & L, int d) ;
void ShellSort ( SeqList & L) ;
void QuickSort ( SeqList & L, int low, int high) ;
void HeapAdjust ( SeqList & L, int low, int high) ;
void HeapSort ( SeqList & L) ;
void QuickSort ( SeqList & L, int low, int high)
{
if ( low < high)
{
int i = low, j = high;
L. r[ 0 ] = L. r[ low] ;
while ( i < j)
{
while ( i < j && L. r[ j] . key >= L. r[ 0 ] . key)
j-- ;
if ( i < j)
L. r[ i++ ] = L. r[ j] ;
while ( i < j && L. r[ i] . key <= L. r[ 0 ] . key)
i++ ;
if ( i < j)
L. r[ j-- ] = L. r[ i] ;
}
L. r[ i] = L. r[ 0 ] ;
QuickSort ( L, low, i- 1 ) ;
QuickSort ( L, i+ 1 , high) ;
}
}
void SeqListInput ( SeqList & L)
{
int i= 1 ; KeyType x;
scanf ( "%d" , & x) ;
while ( x!= - 1 )
{
L. r[ i++ ] . key= x; scanf ( "%d" , & x) ;
}
L. length= i- 1 ;
}
void SeqListOutput ( SeqList L)
{
int i;
for ( i= 1 ; i<= L. length; i++ )
printf ( "%d " , L. r[ i] . key) ;
printf ( "\n" ) ;
}
int main ( )
{
SeqList L;
SeqListInput ( L) ;
SeqListOutput ( L) ;
QuickSort ( L, 1 , L. length) ;
SeqListOutput ( L) ;
return 0 ;
}
8.4 堆排序
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct
{
RedType r[ MAXSIZE+ 1 ] ;
int length;
} SeqList;
void SeqListInput ( SeqList & L) ;
void SeqListOutput ( SeqList L) ;
void InsertSort ( SeqList & L) ;
void ShellInsert ( SeqList & L, int d) ;
void ShellSort ( SeqList & L) ;
void QuickSort ( SeqList & L, int low, int high) ;
void HeapAdjust ( SeqList & L, int low, int high) ;
void HeapSort ( SeqList & L) ;
void HeapAdjust ( SeqList & L, int low, int high)
{
int i = low, j = 2 * i;
L. r[ 0 ] = L. r[ low] ;
while ( j <= high)
{
if ( j < high && L. r[ j] . key < L. r[ j + 1 ] . key)
j++ ;
if ( L. r[ 0 ] . key < L. r[ j] . key)
{
L. r[ i] = L. r[ j] ;
i = j;
j = 2 * i;
}
else
{
break ;
}
}
L. r[ i] = L. r[ 0 ] ;
}
void HeapSort ( SeqList & L)
{
int i;
for ( i= L. length/ 2 ; i> 0 ; i-- )
HeapAdjust ( L, i, L. length) ;
for ( i= L. length; i> 1 ; i-- )
{
L. r[ 0 ] = L. r[ 1 ] ; L. r[ 1 ] = L. r[ i] ; L. r[ i] = L. r[ 0 ] ;
HeapAdjust ( L, 1 , i- 1 ) ;
}
}
void SeqListInput ( SeqList & L)
{
int i= 1 ; KeyType x;
scanf ( "%d" , & x) ;
while ( x!= - 1 )
{
L. r[ i++ ] . key= x; scanf ( "%d" , & x) ;
}
L. length= i- 1 ;
}
void SeqListOutput ( SeqList L)
{
int i;
for ( i= 1 ; i<= L. length; i++ )
printf ( "%d " , L. r[ i] . key) ;
printf ( "\n" ) ;
}
int main ( )
{
SeqList L;
SeqListInput ( L) ;
SeqListOutput ( L) ;
HeapSort ( L) ;
SeqListOutput ( L) ;
return 0 ;
}
8.5 冒泡排序
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct
{
RedType r[ MAXSIZE+ 1 ] ;
int length;
} SeqList;
void SeqListInput ( SeqList & L) ;
void SeqListOutput ( SeqList L) ;
void BubbleSort ( SeqList & L) ;
void BubbleSort ( SeqList & L)
{
int i, j;
for ( i = 1 ; i <= L. length - 1 ; i++ )
{
if ( i <= 4 && i >= 2 )
{
for ( j = 1 ; j <= L. length; j++ )
printf ( "%d " , L. r[ j] . key) ;
printf ( "\n" ) ;
}
for ( j = 1 ; j <= L. length - i; j++ )
{
if ( L. r[ j] . key > L. r[ j + 1 ] . key)
{
RedType temp = L. r[ j] ;
L. r[ j] = L. r[ j + 1 ] ;
L. r[ j + 1 ] = temp;
}
}
}
}
void SeqListInput ( SeqList & L)
{
int i= 1 ; KeyType x;
scanf ( "%d" , & x) ;
while ( x!= - 1 )
{
L. r[ i++ ] . key= x; scanf ( "%d" , & x) ;
}
L. length= i- 1 ;
}
void SeqListOutput ( SeqList L)
{
int i;
for ( i= 1 ; i<= L. length; i++ )
printf ( "%d " , L. r[ i] . key) ;
printf ( "\n" ) ;
}
int main ( )
{
SeqList L;
SeqListInput ( L) ;
BubbleSort ( L) ;
SeqListOutput ( L) ;
return 0 ;
}
8.6 选择排序
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXSIZE 100
typedef int KeyType;
typedef struct
{
KeyType key;
} RedType;
typedef struct
{
RedType r[ MAXSIZE+ 1 ] ;
int length;
} SeqList;
void SeqListInput ( SeqList & L) ;
void SeqListOutput ( SeqList L) ;
void SelectSort ( SeqList & L) ;
void SelectSort ( SeqList & L)
{
int i, j, minIndex;
for ( i = 1 ; i <= L. length - 1 ; i++ )
{
if ( i <= 4 && i>= 2 )
{
for ( j = 1 ; j <= L. length; j++ )
printf ( "%d " , L. r[ j] . key) ;
printf ( "\n" ) ;
}
minIndex = i;
for ( j = i + 1 ; j <= L. length; j++ )
{
if ( L. r[ j] . key < L. r[ minIndex] . key)
minIndex = j;
}
if ( minIndex != i)
{
RedType temp = L. r[ i] ;
L. r[ i] = L. r[ minIndex] ;
L. r[ minIndex] = temp;
}
}
}
void SeqListInput ( SeqList & L)
{
int i= 1 ; KeyType x;
scanf ( "%d" , & x) ;
while ( x!= - 1 )
{
L. r[ i++ ] . key= x; scanf ( "%d" , & x) ;
}
L. length= i- 1 ;
}
void SeqListOutput ( SeqList L)
{
int i;
for ( i= 1 ; i<= L. length; i++ )
printf ( "%d " , L. r[ i] . key) ;
printf ( "\n" ) ;
}
int main ( )
{
SeqList L;
SeqListInput ( L) ;
SelectSort ( L) ;
SeqListOutput ( L) ;
return 0 ;
}