设元素值为整型的线性表L,采用顺序结构存储,编写函数,分别用选择/冒泡排序算法实现线性表的表排序。
数据结构题目
冒泡排序:
#include <iostream>
#include <stdlib.h>
using namespace std;
#define ListInitSize 256 //初次分配空间大小
#define ListIncrement 128 //空间分配增量大小
typedef struct List
{
int *pData; //动态存储空间的基地址
int length; //存储数据元素的个数
int size; //当前已分配的存储空间的大小
}List;
void InitList( List &L )
{ //初始化顺序表
L.pData = (int *)malloc(ListInitSize * sizeof(int)); //申请存储空间
if( L.pData == NULL )
exit(1); //存储空间申请失败
L.size = ListInitSize; //当前已分配的存储空间大小
L.length = 0; //存储数据元素个数为零
} //InitList
void ListTraverse( List L )
{ //访问并输出每个元素
for( int i = 0; i < L.length; i++ ) //遍历整个顺序表
{
cout<<L.pData[i]<<endl; //访问并输出元素
}
} //ListTraverse
void InsertElem( List &L, int i, int e )
{ //在顺序表第i个位置上插入数据元素e
if( i < 1 || i > L.length+1 ) //参数检查
cout<<"error2"<<endl;
if( L.length >= L.size ) //当前存储空间已满,需增加存储空间
{
int *newbase = ( int* ) realloc( L.pData, (L.size+ListIncrement)*sizeof(int) );
if( newbase == NULL )
cout<<"error3"<<endl; //内存申请失败
L.pData = newbase;
L.size += ListIncrement;
}
//从最后一个元素开始,直到下标为i-1(物理位置)的元素,依次向后挪一个位置
for( int j = L.length-1; j >= i-1; j-- )
L.pData[j+1] = L.pData[j];
L.pData[i-1] = e; //在数组下标为i-1的位置上插入元素e
L.length += 1; //顺序表的长度加1
} //InsertElem
void RankList( List &L )
{
int i, j;
for( i = 0; i < L.length-1; i ++ ) //冒泡排序
{
for( j = 0; j < L.length-i-1; j ++ )
{
if( L.pData[j] > L.pData[j+1] )
{
L.pData[j] = L.pData[j] + L.pData[j+1]; //交换数值
L.pData[j+1] = L.pData[j] - L.pData[j+1];
L.pData[j] = L.pData[j] - L.pData[j+1];
}
}
}
}
int main()
{
List L;
int i, n;
int &e = n;
cout<<"-进行初始化操作-"<<endl;
InitList(L); //初始化
cout<<"-请输入顺序表的长度-"<<endl;
cin>>n;
cout<<"-请逐个输入顺序表的数据元素-"<<endl;
for( i = 1; i <= n; i ++ )
{
cin>>x;
InsertElem(L, i, e);
}
cout<<"输出顺序表如下:"<<endl;
ListTraverse(L); //输出顺序表
cout<<endl;
RankList(L); //排序
cout<<"-进行排序-"<<endl;
cout<<"输出顺序表如下:"<<endl;
ListTraverse(L);
cout<<endl;
}
选择排序:
#include <iostream>
#include <stdlib.h>
using namespace std;
#define ListInitSize 256 //初次分配空间大小
#define ListIncrement 128 //空间分配增量大小
typedef struct List
{
int *pData; //动态存储空间的基地址
int length; //存储数据元素的个数
int size; //当前已分配的存储空间的大小
}List;
void InitList( List &L )
{ //初始化顺序表
cout<<"-进行初始化操作-"<<endl;
L.pData = ( int* )malloc( ListInitSize *sizeof(int) ); //申请存储空间
if( L.pData == NULL )
exit(1); //申请失败
L.size = ListInitSize; //当前已分配的存储空间大小
L.length = 0; //存储元素个数为零
} //InitList
void ListTraverse( List L )
{ //遍历顺序表并输出各个元素
int i;
cout<<"-输出顺序表如下-"<<endl;
for( i = 0; i < L.length; i ++ )
{
cout<<L.pData[i]<<endl;
}
} //ListTraverse
void InsertElem( List &L, int i, int e )
{ //在第i个位置后插入元素e
int *newbase, j;
if( i < 1 || i > L.length+1 ) //参数检查
cout<<"error1"<<endl;
if( L.length >= L.size ) //存储空间已满,需增加存储空间
{
newbase = ( int* )realloc( L.pData, ( L.size + ListIncrement )*sizeof(int) );
if( newbase == NULL ) //内存申请失败
cout<<"error2"<<endl;
L.pData = newbase;
L.size = L.size + ListIncrement;
}
//从最后一个元素开始,逐个往后移一个位置
for( j = L.length; j >= i ; j -- )
{
L.pData[j] = L.pData[j-1];
}
L.pData[i-1] = e; //插入e
L.length += 1; //顺序表长度加一
} //InsertElem
void RankList( List L )
{ //选择排序
cout<<"-进行选择排序操作-"<<endl;
int min, m, i, j, temp;
min = L.pData[0]; //让最小值等于第一个元素
m = 0; //最小值的下标
//从第i个元素的下一个元素开始,当遇到比第一个元素更小的元素时,交换元素值
for( i = 0; i < L.length; i ++ )
{
for( j = i + 1; j < L.length; j ++ )
{
if( L.pData[j] < L.pData[i] ) //遇到比第i个元素更小的元素
{
temp = L.pData[j]; //交换元素值
L.pData[j] = L.pData[i];
L.pData[i] = temp;
}
}
min = L.pData[j]; //本轮循环结束后,更新最小值及其下标
m = j;
}
} //RankList
int main()
{
List L;
int i, n;
int &e = n;
InitList(L); //初始化顺序表
cout<<"-请输入顺序表的长度-"<<endl;
cin>>n;
cout<<"-请逐个输入顺序表的数据元素-"<<endl;
for( i = 1; i <= n; i ++ )
{
cin>>x;
InsertElem(L, i, e);
}
ListTraverse(L); //输出顺序表
RankList(L); //选择排序
ListTraverse(L); //再次输出顺序表
}