顺序表及其基本操作验证程序设计
完成顺序表的建立、插入、删除、查找、遍历、排序、合并、归并等算法功能及实现。
#include<iostream>
#include<malloc.h> //malloc()等
#include<stdio.h>
#include<process.h>
using namespace std;
#define TRUE 1 //函数结果状态
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 20 //表的空间初始分配量
#define LISTINCREMENT 2 //储存空间分配增量
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType; //
typedef struct SqList //顺序表结构
{
ElemType *elem; //首地址
int length;
int listsize;
};
Status InitList(SqList *L) //构造空表
{
(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!(*L).elem) exit(OVERFLOW);
(*L).listsize = LIST_INIT_SIZE;
(*L).length = 0;
return OK;
}
Status GetElem(SqList L, int i, ElemType *e) //获取表中第i个元素的值并用e返回
{
if (i<1 || i>L.length) exit(ERROR);
*e = *(L.elem + i - 1);
return OK;
}
//返回表中第一个与e相等的元素位序
int LocateElem(SqList L, ElemType e)
{
for (int i = 1; i <= L.length; i++) if (*(L.elem + i - 1) == e) return i;
return 0;
}
Status ListInsert(SqList *L, int i, ElemType e) //第i个位置前插入e,表长+1
{
ElemType *newbase, *p;
if (i<1 || i>(*L).length + 1) return ERROR;
if ((*L).length >= (*L).listsize)
{
newbase = (ElemType*)realloc((*L).elem, ((*L).length + LISTINCREMENT) * sizeof(ElemType));
if (!newbase) exit(OVERFLOW);
(*L).elem = newbase;
(*L).listsize += LISTINCREMENT;
}
for (p = (*L).elem + (*L).length; p>(*L).elem + i - 1; p--) *p = *(p - 1);
*p = e;
(*L).length++;
return OK;
}
Status ListDelete(SqList *L, int i) //删除第i个位置数据,表长-11
{
ElemType *p;
if (i<i || i>(*L).length + 1) return ERROR;
for (p = (*L).elem + i - 1; p <= (*L).elem + (*L).length - 1; p++) *p = *(p + 1);
(*L).length--;
return OK;
}
void Union(SqList *La, SqList Lb)
{
ElemType e;
for (int i = 1; i <= Lb.length; i++)
{
GetElem(Lb, i, &e);
if (!LocateElem(*La, e)) ListInsert(La, (*La).length, e);
}
}
void ListTraverse(SqList L) //表遍历
{
for (int i = 1; i <= L.length; i++)
cout << *(L.elem + i - 1) << " ";
}
void MergeList(SqList La, SqList Lb, SqList *Lc)
{
ElemType ai, bj;
int i = 1, j = 1, k = 1;
InitList(Lc);
while (i <= La.length&&j <= Lb.length)
{
GetElem(La, i, &ai); GetElem(Lb, j, &bj);
if (ai <= bj) { ListInsert(Lc, k++, ai); i++; }
else { ListInsert(Lc, k++, bj); j++; }
}
while (i <= La.length) { GetElem(La, i, &ai); ListInsert(Lc, k++, ai); i++; }
while (j <= Lb.length) { GetElem(Lb, j, &bj); ListInsert(Lc, k++, bj); j++; }
}
void sort(SqList &L)
{
int i, j, t, min;
for (i = 0; i<L.length - 1; i++)
{
t = i;
for (j = i + 1; j<L.length; j++)
{
if (*(L.elem + j)<*(L.elem + t)) t = j;
}
if (t != i) { min = *(L.elem + i); *(L.elem + i) = *(L.elem + t); *(L.elem + t) = min; }
}
}
int num(char str[])
{
int n = 0, i, l;
l = strlen(str);
for (i = 0; i<l; i++) n += int(str[i] - 48)*int(pow(10., l - i - 1));
return n;
}
int input(int &n)
{
char str[100];
cin >> str;
for (int i = 0; i<strlen(str); i++) if (str[i]>'9' || str[i]<'0') { return 0; break; }
n = num(str);
return 1;
}
int input(char &s)
{
char str[100];
cin >> str;
if (strlen(str) != 1) return 0;
else if (str[0] != 'a'&&str[0] != 'B'&&str[0] != 'A'&&str[0] != 'b') return 0;
else { s = str[0]; return 1; }
}
int main()
{
SqList La, Lb, Lc;
InitList(&La); InitList(&Lb);
int i, n, l, e; char s;
cout << "//建立线性表La..." << '\n' << "请输入La的长度:";
while (1) { if (input(La.length) && La.length > 0) break; cout << "输入错误!!!" << '\n' << "请重新输入:"; }
cout << "请输入" << La.length << "个数据给La:";
for (i = 1; i <= La.length; i++) cin >> *(La.elem + i - 1);
cout << endl;
cout << "//建立线性表Lb..." << '\n' << "请输入Lb的长度:";
while(1) {if (input(Lb.length)&&Lb.length>0) break; cout << "输入错误!!!" << '\n' << "请重新输入:"; }
cout << "请输入" << Lb.length << "个数据给Lb:";
for (i = 1; i <= Lb.length; i++) cin >> *(Lb.elem + i - 1);
cout << '\n' << "顺序表La的数据是:"; ListTraverse(La);
cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb);
do {
cout << '\n' << "///////////////////////////////////////////////////////////////////////////////////////////////////////////////////" << '\n' << endl;
cout << "顺序表操作:" << '\n' << " 1.插入数据" << '\t' << '\t' << "2.删除数据" << '\t' << '\t' << "3.查找数据" << '\t' << '\t' << "4.输出顺序表" << '\n' << " 5.非递减排序"
<< '\t' << '\t' << "6.将Lb表合并到La表中" << '\t' << '\t' << "7.将La和Lb归并到新表Lc中" << '\t' << '\t' << "0.退出" << '\n' << '\n' << "请输入操作序号:";
while (1)
{
if (input(n) && n >= 0 && n <= 7) break;
else cout << "****输入错误****" << '\n' << '\n' << "请输入操作序号:";
}
switch (n)
{
case 1:
cout << "选择操作对象(A:La B:Lb):";
while (1)
{
if (!input(s))
cout << "****输入错误****" << '\n' << '\n' << "选择操作对象(A:La B:Lb):";
else break;
}
switch (s)
{
case 'A':
case 'a':
{
cout << "请输入插入位置:";
while (1)
{
if (!input(l) || l<1 || l>La.length + 1) { cout << "****输入错误****" << '\n' << '\n' << "请输入插入位置:"; }
else break;
}
cout << "输入数据:";
while (1) { if (input(e)) break; else cout << "****输入错误****" << '\n' << '\n' << "请重新输入数据:"; }
ListInsert(&La, l, e);
cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl;
} break;
case 'B':
case'b':
{
cout << "请输入插入位置:";
while (1)
{
if (!input(l) || l<1 || l>Lb.length + 1) { cout << "****输入错误****" << '\n' << '\n' << "请输入插入位置:"; }
else break;
}
cout << "输入数据:";
while (1) { if (input(e)) break; else cout << "****输入错误****" << '\n' << '\n' << "请重新输入数据:"; }
ListInsert(&Lb, l, e);
cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb); cout << endl;
} break;
}
break;
case 2:
cout << "选择操作对象(A:La B:Lb): ";
while (1)
{
if (!input(s))
cout << "输入错误!!!" << '\n' << '\n' << "选择操作对象(A:La B:Lb):";
else break;
}
switch (s)
{
case 'A':
case 'a':
{
cout << "请输入删除位置:";
while (1)
{
if (!input(l) || l<1 || l>La.length) { cout << "****输入错误****" << '\n' << '\n' << "请输入插入位置:"; }
else { ListDelete(&La, l); break; }
}
cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl;
} break;
case 'B':
case'b':
{
cout << "请输入删除位置:";
while (1)
{
if (!input(l) || l<1 || l>Lb.length) { cout << "****输入错误****" << '\n' << '\n' << "请输入插入位置:"; }
else { ListDelete(&Lb, l); break; }
}
cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb); cout << endl;
} break;
}break;
case 3:
{
cout << "输入查找数据: "; int data;
while (1)
{
if (!input(data)) cout << "****输入错误****" << '\n' << '\n' << "输入查找数据:";
else { cout << '\n'; break; }
}
if (LocateElem(La, data)>0)
{
cout << "顺序表La中";
for (i = 1; i <= La.length; i++) if (data == *(La.elem + i - 1)) cout << "(" << i << ")";
cout << "位置存在数据" << data << endl;
if (LocateElem(Lb, data)>0)
{
cout << "顺序表Lb中";
for (i = 1; i <= Lb.length; i++) if (data == *(Lb.elem + i - 1)) cout << "(" << i << ")";
cout << "位置存在数据" << data << endl;
}
}
else cout << "不存在此数据...." << endl;
}break;
case 4:
{
cout << "选择操作对象(A:La B:Lb): ";
while (1)
{
if (!input(s))
cout << "****输入错误****" << '\n' << '\n' << "选择操作对象(A:La B:Lb):";
else break;
}
switch (s)
{
case 'A':
case 'a': {cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl; } break;
case 'B':
case 'b': {cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb); cout << endl; } break;
}
}
case 5:
cout << "选择操作对象(A:La B:Lb): ";
while (1)
{
if (!input(s))
cout << "****输入错误****" << '\n' << '\n' << "选择操作对象(A:La B:Lb):";
else break;
}
switch (s)
{
case 'A':
case 'a': {sort(La); cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl; } break;
case 'B':
case 'b': {sort(Lb); cout << '\n' << "顺序表Lb的数据是:"; ListTraverse(Lb); cout << endl; } break;
}break;
case 6: {Union(&La, Lb); cout << '\n' << "顺序表La的数据是:"; ListTraverse(La); cout << endl; }break;
case 7: {MergeList(La, Lb, &Lc); cout << '\n' << "顺序表Lc的数据是:"; ListTraverse(Lc); cout << endl; }break;
}
} while (n>0);
}
运行结果: