顺序表的定义及其建立、插入、删除、查找、遍历、排序、合并、归并等操作的实现
```cpp
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#include<iostream>
using namespace std;
//线性表的顺序储存结构
typedef int ElemType; //定义ElemType为int类型
typedef struct{
ElemType *data; //存放顺序表中的元素
int length; //存放顺序表当前的长度
int listsize;
}SqList; //声明顺序表的类型
//初始化当前顺序表长度为0
void InitList(SqList &L){ //L回传给实参,用引用类型
L.data = new int[LIST_INIT_SIZE];
L.length = 0;
L.listsize =LISTINCREMENT;
}
//返回L中第i个元素的值
int GetElem(SqList L, int i, ElemType &e){
if(i<1 || i>L.length) //参数i错误时返回0
return 0;
else{
e = L.data[i-1];
return 1;
}
}
void locateElem(SqList&l) //查找
{int num;
cout<<"请输入您要查找的数据,我们会返回它的序数";
cin>>num;
for (int i = 0; i < l.length; i++) {
while (l.data[i] == num) {
cout << "要查找的数据序号为" <<i+1<<endl;
break;
}
while (i + 1 > l.length+1) {
cout << "查无此数据" << endl;
break;
}
}cout<<endl;}
//输出数据
void output(SqList b)
{
cout << "当前顺序表如下>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> " << endl;
for (int i = 0; i < b.length; i++) {
cout << b.data[i] << endl;
}
cout << endl;
}
void print(int*p)//输出函数,用于遍历
{printf("%d ", *p);
}
void ListTraverse(SqList l,void(*print)(int*))
{ cout<<"遍历操作为输出顺序表"<<endl;
int *p;
p=l.data;
for( int i=1; i<=l.length; i++) {print(p);p++;}
;
}
//插入数据
void Listlnsert(SqList&l)
{
int pos;
cout << "请输入要插入的位置(编号)" << endl;
cin >> pos;
l.length++;
while (pos <= 0 || pos > l.length) {
cout << "插入位置不合法,请重新输入" << endl;
cin >> pos;
}
while (pos <= l.length - 1)
{
for (int i = l.length - 1; i > pos - 1; i--) {
l.data[i] = l.data[i - 1];
}
break;
}
cout << "请输入要插入的数据" << endl;
cin >> l.data[pos - 1];
cout << "表长" << l.length << endl;
cout << endl;
output(l);
}
void input(SqList&a) //创建
{
int num;
cout << "请输入数据个数" << endl;
cin >> num;
while (num > a.listsize) {
a.listsize += LISTINCREMENT;
}
if (a.listsize > LIST_INIT_SIZE) {
cout << "表格已延长" << a.listsize - LIST_INIT_SIZE << ",当前表长" << a.listsize << endl;
}
for (int i = 0; i < num; i++) {
cout << "请输如第" << i + 1 << "个数据" << endl;
cin >> a.data[i];
a.length++;
}
cout << endl;
output(a);}
//将顺序表的第i个元素ai删除,顺序表的长度减一
//参数L需要回代,用引用的方式&,i为要删除元素的额位置
int ListDelete(SqList&L){
int j=0;int i; cout << "请输入要删除的位置(编号)" << endl;
cin >> i;
if(i<1||i>L.length)
return 0;
for(j=i; j<L.length; j++)
L.data[j-1] = L.data[j];
L.length--;
output(L);return 1;
}
//顺序表A和B按照非递减有序排列,将A和B合并到新的顺序表C中,且为非递减有序排列
void merge(SqList A, SqList B, SqList &C){
int i=0,j=0,k=0; //K记录c中元素的个数,i为A,j为B
while(i<A.length && j<B.length){ //是否有其中一个加入完成
if(A.data[i]<B.data[i]){
C.data[k] = A.data[i];
i++; k++;
}
else if(A.data[i]>B.data[j]){
C.data[k] = B.data[j];
j++; k++;
}
else{ //A.data[i] = B.data[i]
C.data[k] = A.data[i];
i++; k++;
C.data[k] = B.data[j];
j++; k++;
}
}
while(i<A.length){ //B全部加入到C了,剩余的A中元素全部往C后面加入即可
C.data[k] = A.data[i];
i++;k++;
}
while(j<B.length){ //A全部加入到C了,同上
C.data[k] = B.data[i];
j++;k++;
}
C.length = k; //C的长度
}
void ListSort_Sq(SqList &L)
{ int i, j, tmp, max;
for(i = 0; i < L.length - 1; i++)
{ max = i;
for(j = i; j < L.length; j++)
{ if(L.data[max] > L.data[j])
max = j; }
tmp = L.data[i];
L.data[i] = L.data[max];
L.data[max] = tmp; }
cout<<"排序完毕"<<endl;
}
int main()
{SqList L1,L2,L3;
InitList(L1);InitList(L2);InitList(L3);
cout<<"您正在建立L1:"<<endl;
input(L1);
Listlnsert(L1);
locateElem(L1);
ListSort_Sq(L1);
ListTraverse(L1,print);
cout<<"您正在建立L2:"<<endl;
input(L2);
ListDelete(L2);
ListSort_Sq(L2);
ListTraverse(L2,print);cout<<endl;
cout<<"将L1,L2归并成L3"<<endl;
merge(L1,L2,L3);
ListTraverse(L3,print);
system("PAUSE");
}