算法2.1
假设利用两个线性表
LA
和
LB
分别表示两个集合
A
和
动态演示
算法如下
void Union(List &La, List Lb) { // 算法2.1
// 将所有在线性表Lb中但不在La中的数据元素插入到La中
int La_len,Lb_len,i;
ElemType e;
La_len = ListLength(La); // 求线性表的长度
Lb_len = ListLength(Lb);
for (i=1; i<=Lb_len; i++) {
GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e
if (!LocateElem(La, e, equal)) // La中不存在和e相同的数据元素
ListInsert(La, ++La_len, e); // 插入
}
} // union
实现(C++版本非数组版//数组实现较为简单)
//所有定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef int Status ;//为了方便算法可用性,算法的Status可以通过这里可改
typedef char ElemType;//为了输出的可用性,数据的ElemType可以通过这里更改
//数据结构的定义
typedef struct{
ElemType *elem;//分配空间基址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}List;
//包含的头文件
#include <iostream>
using namespace std;
void print(ElemType *c)
{
cout << *c;
}
Status InitList(List *L) /* 算法2.3 */
{ /* 操作结果:构造一个空的顺序线性表 */
(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!(*L).elem)
exit(OVERFLOW); /* 存储分配失败 */
(*L).length = 0; /* 空表长度为0 */
(*L).listsize = LIST_INIT_SIZE; /* 初始存储容量 */
return OK;
}
Status ClearList(List *L)
{ /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
(*L).length = 0;
return OK;
}
int ListLength(List L)
{ /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
return L.length;
}
Status GetElem(List L, int i, ElemType *e)
{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
if (i<1 || i>L.length)
exit(ERROR);
*e = *(L.elem + i - 1);
return OK;
}
int LocateElem(List L, ElemType e, Status(*compare)(ElemType, ElemType))
{ /* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
/* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0。算法2.6 */
ElemType *p;
int i = 1; /* i的初值为第1个元素的位序 */
p = L.elem; /* p的初值为第1个元素的存储位置 */
while (i <= L.length&&!compare(*p++, e))
++i;
if (i <= L.length)
return i;
else
return 0;
}
Status ListInsert(List *L, int i, ElemType e) /* 算法2.4 */
{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
ElemType *newbase, *q, *p;
if (i<1 || i>(*L).length + 1) /* i值不合法 */
return ERROR;
if ((*L).length >= (*L).listsize) /* 当前存储空间已满,增加分配 */
{
newbase = (ElemType *)realloc((*L).elem,((*L).listsize + LISTINCREMENT)*sizeof(ElemType));
if (!newbase)
exit(OVERFLOW); /* 存储分配失败 */
(*L).elem = newbase; /* 新基址 */
(*L).listsize += LISTINCREMENT; /* 增加存储容量 */
}
q = (*L).elem + i - 1; /* q为插入位置 */
for (p = (*L).elem + (*L).length - 1; p >= q; --p) /* 插入位置及之后的元素右移 */
*(p + 1) = *p;
*q = e; /* 插入e */
++(*L).length; /* 表长增1 */
return OK;
}
Status equal(ElemType c1, ElemType c2)
{ /* 判断是否相等的函数,Union()用到 */
if (c1 == c2)
return TRUE;
else
return FALSE;
}
Status ListTraverse(List L, void(*vi)(ElemType*))
{ /* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */
/* vi()的形参加'&',表明可通过调用vi()改变元素的值 */
ElemType *p;
int i;
p = L.elem;
for (i = 1; i <= L.length; i++)
vi(p++);
return OK;
}
void Union(List *La, List Lb) /* 算法2.1 */
{ /* 将所有在线性表Lb中但不在La中的数据元素插入到La中 */
ElemType e;
int La_len, Lb_len;
int i;
La_len = ListLength(*La); /* 求线性表的长度 */
Lb_len = ListLength(Lb);
for (i = 1; i <= Lb_len; i++)
{
GetElem(Lb, i, &e); /* 取Lb中第i个数据元素赋给e */
if (!LocateElem(*La, e, equal)) /* La中不存在和e相同的元素,则插入之 */
ListInsert(La, ++La_len, e);
}
}
//主函数
int main()
{
//本程序说明,是在VS2013中运行的,若是其他地方无法运行,建议修改代码
//程序声明
cout << "***************************************************************************"<<endl;
cout << " 《数据结构》<C语言版本>严蔚敏 吴伟名 编著 "<<endl;
cout << " 编写年月2016年3月 "<<endl;
cout << " 编写者:YuYunTan " << endl;
cout << " 算法2.1 "<<endl;
cout << "***************************************************************************" << endl;
//test1
cout << "Test 1:" << endl;
//定义A
List A,B;
Status return_function_status;
return_function_status = InitList(&A);
//判断A空表是否建立成功
if (return_function_status == OK){
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
return_function_status = ERROR;
//判断B空表是否建立成功
return_function_status = InitList(&B);
if (return_function_status == OK)
{
cout << " List B = <";
ListTraverse(B,print);
cout << ">"<<endl;
}
}
if (return_function_status == OK){
//都建立表成功了
//做测试1
cout << " Union(A,B),A=<";
Union(&A,B);
ListTraverse(A,print);
cout << ">"<<endl;
//做测试2
cout << "Test 2:" << endl;
ListInsert(&A, 1,'I');
ListInsert(&A, 2, 'J');
ListInsert(&A, 3, 'L');
ListInsert(&A, 4, 'O');
ListInsert(&A, 5, 'P');
ListInsert(&A, 6, 'Q');
ListInsert(&A, 7, 'R');
ListInsert(&A, 8, 'S');
ListInsert(&A, 9, 'U');
ListInsert(&A, 10, 'V');
ListInsert(&A, 11, 'X');
ListInsert(&A, 12, 'Y');
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 'B');
ListInsert(&B, 2, 'D');
ListInsert(&B, 3, 'F');
ListInsert(&B, 4, 'I');
ListInsert(&B, 5, 'L');
ListInsert(&B, 6, 'N');
ListInsert(&B, 7, 'P');
ListInsert(&B, 8, 'S');
ListInsert(&B, 9, 'T');
ListInsert(&B, 10, 'V');
ListInsert(&B, 11, 'Y');
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Union(A,B),A=<";
Union(&A, B);
ListTraverse(A, print);
cout << ">" << endl;
//测试3
ClearList(&A);
ClearList(&B);
cout << "Test 3:" << endl;
ListInsert(&A, 1, 'H');
ListInsert(&A, 2, 'I');
ListInsert(&A, 3, 'K');
ListInsert(&A, 4, 'M');
ListInsert(&A, 5, 'P');
ListInsert(&A, 6, 'S');
ListInsert(&A, 7, 'T');
ListInsert(&A, 8, 'W');
ListInsert(&A, 9, 'X');
ListInsert(&A, 10, 'Y');
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 'A');
ListInsert(&B, 2, 'D');
ListInsert(&B, 3, 'F');
ListInsert(&B, 4, 'I');
ListInsert(&B, 5, 'J');
ListInsert(&B, 6, 'L');
ListInsert(&B, 7, 'N');
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Union(A,B),A=<";
Union(&A, B);
ListTraverse(A, print);
cout << ">" << endl;
//测试4
ClearList(&A);
ClearList(&B);
cout << "Test 4:" << endl;
ListInsert(&A, 1, 'F');
ListInsert(&A, 2, 'H');
ListInsert(&A, 3, 'K');
ListInsert(&A, 4, 'N');
ListInsert(&A, 5, 'O');
ListInsert(&A, 6, 'P');
ListInsert(&A, 7, 'R');
ListInsert(&A, 8, 'S');
ListInsert(&A, 9, 'U');
ListInsert(&A, 10, 'V');
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 'H');
ListInsert(&B, 2, 'I');
ListInsert(&B, 3, 'J');
ListInsert(&B, 4, 'M');
ListInsert(&B, 5, 'P');
ListInsert(&B, 6, 'R');
ListInsert(&B, 7, 'T');
ListInsert(&B, 8, 'U');
ListInsert(&B, 9, 'W');
ListInsert(&B, 10, 'Z');
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Union(A,B),A=<";
Union(&A, B);
ListTraverse(A, print);
cout << ">" << endl;
//测试5
ClearList(&A);
ClearList(&B);
cout << "Test 5:" << endl;
ListInsert(&A, 1, 'D');
ListInsert(&A, 2, 'E');
ListInsert(&A, 3, 'H');
ListInsert(&A, 4, 'K');
ListInsert(&A, 5, 'L');
ListInsert(&A, 6, 'O');
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 'A');
ListInsert(&B, 2, 'B');
ListInsert(&B, 3, 'C');
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Union(A,B),A=<";
Union(&A, B);
ListTraverse(A, print);
cout << ">" << endl;
}
else{
cout << "error:don't create List,malloc is fall!";
}
system("pause");
return 0;
}
运行结果:
算法2.2
已知线性表
LA
和
LB
中的数据元素按值非递减有序排列,先要求将
LA
和
LB
归并为一个新的线性表
LC
,且
LC
中的数据元素仍按值非递减有序排列。
例如,设
则 LC=(2,3,5,6,8,8,9,11,11,15,20)
思路点拨
LC中的元素或是LA中的数据元素,或是LB中的数据元素,则只要先设LC为空表,然后将LA或LB中的元素逐个插入到LC中即可。为了使得LC中的元素也是按值顺序非递减有序排列,那么我们可以设置两个指针i和j分别指向LA和LB中的某个元素,若设i当前所指的元素为a,j当前所指的元素为b,则当当前应插入到LC中的元素c为
c={a当(a≤b时)b当(a>b时)
显然,指针i和j的初值均为1,在所指元素插入LC之后,在LA或LB中顺序后移。上述归并算法如下:
void MergeList(List La, List Lb, List &Lc) { // 算法2.2
// 已知线性表La和Lb中的元素按值非递减排列。
// 归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。
int La_len, Lb_len;
ElemType ai, bj;
int i=1, j=1, k=0;
InitList(Lc);
La_len = ListLength(La);
Lb_len = ListLength(Lb);
while ((i <= La_len) && (j <= Lb_len)) { // La和Lb均非空
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_len) {
GetElem(La, i++, ai); ListInsert(Lc, ++k, ai);
}
while (j <= Lb_len) {
GetElem(Lb, j++, bj); ListInsert(Lc, ++k, bj);
}
} // MergeList
算法实现
//所有定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef int Status;//为了方便算法可用性,算法的Status可以通过这里可改
typedef int ElemType;//为了输出的可用性,数据的ElemType可以通过这里更改
//数据结构的定义
typedef struct{
ElemType *elem;//分配空间基址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}List;
//包含的头文件
#include <iostream>
using namespace std;
void print(ElemType *c)
{
cout << *c <<" ";
}
Status InitList(List *L) /* 算法2.3 */
{ /* 操作结果:构造一个空的顺序线性表 */
(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!(*L).elem)
exit(OVERFLOW); /* 存储分配失败 */
(*L).length = 0; /* 空表长度为0 */
(*L).listsize = LIST_INIT_SIZE; /* 初始存储容量 */
return OK;
}
Status ClearList(List *L)
{ /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
(*L).length = 0;
return OK;
}
int ListLength(List L)
{ /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
return L.length;
}
Status GetElem(List L, int i, ElemType *e)
{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
if (i<1 || i>L.length)
exit(ERROR);
*e = *(L.elem + i - 1);
return OK;
}
Status ListInsert(List *L, int i, ElemType e) /* 算法2.4 */
{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
ElemType *newbase, *q, *p;
if (i<1 || i>(*L).length + 1) /* i值不合法 */
return ERROR;
if ((*L).length >= (*L).listsize) /* 当前存储空间已满,增加分配 */
{
newbase = (ElemType *)realloc((*L).elem, ((*L).listsize + LISTINCREMENT)*sizeof(ElemType));
if (!newbase)
exit(OVERFLOW); /* 存储分配失败 */
(*L).elem = newbase; /* 新基址 */
(*L).listsize += LISTINCREMENT; /* 增加存储容量 */
}
q = (*L).elem + i - 1; /* q为插入位置 */
for (p = (*L).elem + (*L).length - 1; p >= q; --p) /* 插入位置及之后的元素右移 */
*(p + 1) = *p;
*q = e; /* 插入e */
++(*L).length; /* 表长增1 */
return OK;
}
Status ListTraverse(List L, void(*vi)(ElemType*))
{ /* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */
/* vi()的形参加'&',表明可通过调用vi()改变元素的值 */
ElemType *p;
int i;
p = L.elem;
cout << " ";
for (i = 1; i <= L.length; i++)
vi(p++);
return OK;
}
void MergeList(List La, List Lb, List *Lc) /* 算法2.2 */
{ /* 已知线性表La和Lb中的数据元素按值非递减排列。 */
/* 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列 */
int i = 1, j = 1, k = 0;
int La_len, Lb_len;
ElemType ai, bj;
InitList(Lc); /* 创建空表Lc */
La_len = ListLength(La);
Lb_len = ListLength(Lb);
while (i <= La_len&&j <= Lb_len) /* 表La和表Lb均非空 */
{
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_len) /* 表La非空且表Lb空 */
{
GetElem(La, i++, &ai);
ListInsert(Lc, ++k, ai);
}
while (j <= Lb_len) /* 表Lb非空且表La空 */
{
GetElem(Lb, j++, &bj);
ListInsert(Lc, ++k, bj);
}
}
//主函数
int main()
{
//本程序说明,是在VS2013中运行的,若是其他地方无法运行,建议修改代码
//程序声明
cout << "***************************************************************************" << endl;
cout << " 《数据结构》<C语言版本>严蔚敏 吴伟名 编著 " << endl;
cout << " 编写年月2016年3月 " << endl;
cout << " 编写者:YuYunTan " << endl;
cout << " 算法2.2 " << endl;
cout << "***************************************************************************" << endl;
//test1
cout << "Test 1:" << endl;
//定义A
List A, B, C;
Status return_function_status;
return_function_status = InitList(&A);
//判断A空表是否建立成功
if (return_function_status == OK){
cout << " List A = <";
ListInsert(&A, 1, 72);
ListInsert(&A, 2, 96);
ListTraverse(A, print);
cout << ">" << endl;
return_function_status = ERROR;
//判断B空表是否建立成功
return_function_status = InitList(&B);
if (return_function_status == OK)
{
cout << " List B = <";
ListInsert(&B, 1, 2);
ListInsert(&B, 2, 42);
ListInsert(&B, 3, 51);
ListInsert(&B, 4, 52);
ListInsert(&B, 5, 71);
ListInsert(&B, 6, 72);
ListInsert(&B, 7, 78);
ListTraverse(B, print);
cout << ">" << endl;
}
}
if (return_function_status == OK){
//都建立表成功了
//做测试1
cout << " Merge(A,B)=<";
MergeList(A,B,&C);
ListTraverse(C, print);
cout << ">" << endl;
//做测试2
ClearList(&A);
ClearList(&B);
ClearList(&C);
cout << "Test 2:" << endl;
ListInsert(&A, 1, 16);
ListInsert(&A, 2, 24);
ListInsert(&A, 3, 49);
ListInsert(&A, 4, 50);
ListInsert(&A, 5, 58);
ListInsert(&A, 6, 76);
ListInsert(&A, 7, 94);
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 94);
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
//测试3
ClearList(&A);
ClearList(&B);
ClearList(&C);
cout << "Test 3:" << endl;
ListInsert(&A, 1, 27);
ListInsert(&A, 2, 44);
ListInsert(&A, 3, 83);
ListInsert(&A, 4, 86);
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 23);
ListInsert(&B, 2, 24);
ListInsert(&B, 3, 45);
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
//测试4
ClearList(&A);
ClearList(&B);
ClearList(&C);
cout << "Test 4:" << endl;
ListInsert(&A, 1, 27);
ListInsert(&A, 2, 52);
ListInsert(&A, 3, 54);
ListInsert(&A, 4, 66);
ListInsert(&A, 5, 69);
ListInsert(&A, 6, 79);
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 15);
ListInsert(&B, 2, 81);
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
//测试5
ClearList(&A);
ClearList(&B);
ClearList(&C);
cout << "Test 5:" << endl;
ListInsert(&A, 1, 22);
ListInsert(&A, 2, 72);
ListInsert(&A, 3, 75);
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 2);
ListInsert(&B, 2, 7);
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
}
else{
cout << "error:don't create List,malloc is fall!";
}
system("pause");
return 0;
}
运行结果
算法2.7
对上述的合并处于复杂度 O(La.length+Lb.length)
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) { // 算法2.7
// 已知顺序线性表La和Lb的元素按值非递减排列。
// 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa = La.elem; pb = Lb.elem;
Lc.listsize = Lc.length = La.length+Lb.length;
pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
if (!Lc.elem)
exit(OVERFLOW); // 存储分配失败
pa_last = La.elem+La.length-1;
pb_last = Lb.elem+Lb.length-1;
while (pa <= pa_last && pb <= pb_last) { // 归并
if (*pa <= *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while (pa <= pa_last) *pc++ = *pa++; // 插入La的剩余元素
while (pb <= pb_last) *pc++ = *pb++; // 插入Lb的剩余元素
} // MergeList
算法实现
//所有定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef int Status;//为了方便算法可用性,算法的Status可以通过这里可改
typedef int ElemType;//为了输出的可用性,数据的ElemType可以通过这里更改
//数据结构的定义
typedef struct{
ElemType *elem;//分配空间基址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}List;
//包含的头文件
#include <iostream>
using namespace std;
void print(ElemType *c)
{
cout << *c << " ";
}
Status InitList(List *L) /* 算法2.3 */
{ /* 操作结果:构造一个空的顺序线性表 */
(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!(*L).elem)
exit(OVERFLOW); /* 存储分配失败 */
(*L).length = 0; /* 空表长度为0 */
(*L).listsize = LIST_INIT_SIZE; /* 初始存储容量 */
return OK;
}
Status ClearList(List *L)
{ /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
(*L).length = 0;
return OK;
}
int ListLength(List L)
{ /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
return L.length;
}
Status GetElem(List L, int i, ElemType *e)
{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
if (i<1 || i>L.length)
exit(ERROR);
*e = *(L.elem + i - 1);
return OK;
}
Status ListInsert(List *L, int i, ElemType e) /* 算法2.4 */
{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
ElemType *newbase, *q, *p;
if (i<1 || i>(*L).length + 1) /* i值不合法 */
return ERROR;
if ((*L).length >= (*L).listsize) /* 当前存储空间已满,增加分配 */
{
newbase = (ElemType *)realloc((*L).elem, ((*L).listsize + LISTINCREMENT)*sizeof(ElemType));
if (!newbase)
exit(OVERFLOW); /* 存储分配失败 */
(*L).elem = newbase; /* 新基址 */
(*L).listsize += LISTINCREMENT; /* 增加存储容量 */
}
q = (*L).elem + i - 1; /* q为插入位置 */
for (p = (*L).elem + (*L).length - 1; p >= q; --p) /* 插入位置及之后的元素右移 */
*(p + 1) = *p;
*q = e; /* 插入e */
++(*L).length; /* 表长增1 */
return OK;
}
Status ListTraverse(List L, void(*vi)(ElemType*))
{ /* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */
/* vi()的形参加'&',表明可通过调用vi()改变元素的值 */
ElemType *p;
int i;
p = L.elem;
cout << " ";
for (i = 1; i <= L.length; i++)
vi(p++);
return OK;
}
void MergeList(List La, List Lb, List *Lc) /* 算法2.7 */
{ /* 已知顺序线性表La和Lb的元素按值非递减排列。 */
/* 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列 */
ElemType *pa, *pa_last, *pb, *pb_last, *pc;
pa = La.elem;
pb = Lb.elem;
(*Lc).listsize = (*Lc).length = La.length + Lb.length;/*不用InitList()创建空表Lc */
pc = (*Lc).elem = (ElemType *)malloc((*Lc).listsize*sizeof(ElemType));
if (!(*Lc).elem) /* 存储分配失败 */
exit(OVERFLOW);
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while (pa <= pa_last&&pb <= pb_last) /* 表La和表Lb均非空 */
{ /* 归并 */
if (*pa <= *pb)
*pc++ = *pa++;
else
*pc++ = *pb++;
}
while (pa <= pa_last) /* 表La非空且表Lb空 */
*pc++ = *pa++; /* 插入La的剩余元素 */
while (pb <= pb_last) /* 表Lb非空且表La空 */
*pc++ = *pb++; /* 插入Lb的剩余元素 */
}
//主函数
int main()
{
//本程序说明,是在VS2013中运行的,若是其他地方无法运行,建议修改代码
//程序声明
cout << "***************************************************************************" << endl;
cout << " 《数据结构》<C语言版本>严蔚敏 吴伟名 编著 " << endl;
cout << " 编写年月2016年3月 " << endl;
cout << " 编写者:YuYunTan " << endl;
cout << " 算法2.7 " << endl;
cout << "***************************************************************************" << endl;
//test1
cout << "Test 1:" << endl;
//定义A
List A, B, C;
Status return_function_status;
return_function_status = InitList(&A);
//判断A空表是否建立成功
if (return_function_status == OK){
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
return_function_status = ERROR;
//判断B空表是否建立成功
return_function_status = InitList(&B);
if (return_function_status == OK)
{
cout << " List B = <";
ListInsert(&B, 1, 3);
ListInsert(&B, 2, 33);
ListTraverse(B, print);
cout << ">" << endl;
}
}
if (return_function_status == OK){
//都建立表成功了
//做测试1
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
//做测试2
ClearList(&A);
ClearList(&B);
ClearList(&C);
cout << "Test 2:" << endl;
ListInsert(&A, 1, 11);
ListInsert(&A, 2, 16);
ListInsert(&A, 3, 17);
ListInsert(&A, 4, 71);
ListInsert(&A, 5, 78);
ListInsert(&A, 6, 92);
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 33);
ListInsert(&B, 2, 80);
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
//测试3
ClearList(&A);
ClearList(&B);
ClearList(&C);
cout << "Test 3:" << endl;
ListInsert(&A, 1, 3);
ListInsert(&A, 2, 31);
ListInsert(&A, 3, 41);
ListInsert(&A, 4, 48);
ListInsert(&A, 5, 65);
ListInsert(&A, 6, 95);
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 30);
ListInsert(&B, 2, 40);
ListInsert(&B, 3, 46);
ListInsert(&B, 4, 47);
ListInsert(&B, 5, 61);
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
//测试4
ClearList(&A);
ClearList(&B);
ClearList(&C);
cout << "Test 4:" << endl;
ListInsert(&A, 1, 34);
ListInsert(&A, 2, 44);
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 6);
ListInsert(&B, 2, 46);
ListInsert(&B, 3, 70);
ListInsert(&B, 4, 78);
ListInsert(&B, 5, 94);
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
//测试5
ClearList(&A);
ClearList(&B);
ClearList(&C);
cout << "Test 5:" << endl;
ListInsert(&A, 1, 25);
ListInsert(&A, 2, 39);
ListInsert(&A, 3, 82);
cout << " List A = <";
ListTraverse(A, print);
cout << ">" << endl;
ListInsert(&B, 1, 38);
ListInsert(&B, 2, 96);
cout << " List B = <";
ListTraverse(B, print);
cout << ">" << endl;
cout << " Merge(A,B)=<";
MergeList(A, B, &C);
ListTraverse(C, print);
cout << ">" << endl;
}
else{
cout << "error:don't create List,malloc is fall!";
}
system("pause");
return 0;
}
运行结果
到目前为止,书本上三题目均以实现,后面的将是线性表的链式表示和实现~~