您的位置:首页 > 其它

基于顺序表的两个非递减有序表的合并

2015-12-24 19:51 246 查看
头文件:SqList.h

#include<cstdlib>

#include<iostream>

using namespace std;

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

//#define OVERFLOW -2

typedef int ElemType;

typedef int Status;

typedef struct

{

ElemType *elem;

int length;

int listsize;

}SqList;

//构造一个空的线性表L

Status InitList_Sq(SqList& L)

{

L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if (!L.elem)

exit(OVERFLOW);

L.length = 0;

L.listsize = LIST_INIT_SIZE;

return OK;

}

//销毁线性表L

Status DestroyList_Sq(SqList& L)

{

free(L.elem);

L.elem = NULL;

return OK;

}

//将线性表L置为空表

Status ClearList_Sq(SqList& L)

{

L.length = 0;

L.listsize = LIST_INIT_SIZE;

return OK;

}

//判断线性表L是否为空

Status ListEmpty_Sq(SqList L)

{

if (0 == L.length)

return TRUE;

else

return FALSE;

}

//返回线性表L中数据元素个数

int ListLength_Sq(SqList L)

{

return L.length;

}

//用元素e返回线性表L中第i个数据元素的值

Status GetElem_Sq(SqList L, int i, ElemType &e)

{

if (i<1 || i>L.length)

exit(ERROR);

e = *(L.elem + i - 1);

return OK;

}

//数据元素之间的关系函数,例如数学关系:a=b

Status compare(ElemType a, ElemType b)

{

if (a ==b)

return TRUE;

else

return FALSE;

}

//返回线性表L中第一个与元素e满足compare()关系的数据元素的位序;若不存在,返回0

int LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType,ElemType))

{

int i = 1;

ElemType* p = L.elem;

while (i <= L.length&&!(*compare)(*p++, e))

++i;

if (i <= L.length)

return i;

else

return 0;

}

//若cur_e是线性表L中的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义

Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType& pre_e)

{

int i = LocateElem_Sq(L, cur_e, compare);

if(i>1&&i<=L.length)

{

pre_e = *(L.elem + i - 2);

return OK;

}

return ERROR;

}

//若cur_e是线性表L中的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义

Status NextElem_Sq(SqList L, ElemType cur_e, ElemType& next_e)

{

int i = LocateElem_Sq(L, cur_e, compare);

if (i>=1 && i < L.length)

{

next_e = *(L.elem + i);

return OK;

}

return ERROR;

}

//在线性表L中第i个位置之前插入新的数据元素e,表L的长度加1

Status ListInsert_Sq(SqList& L, int i, ElemType e)

{

if (i<1 || i>L.length + 1)

return ERROR;

if (L.length >= L.listsize)

{

ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));

if (!(newbase))

exit(OVERFLOW);

L.elem = newbase;

L.listsize += LISTINCREMENT;

}

ElemType* q = &(L.elem[i - 1]);

for (ElemType* p = &(L.elem[L.length - 1]); p >= q; --p)

*(p + 1) = *p;

*q = e;

++L.length;

return OK;

}

//删除线性表L的第i个元素,并用元素e返回其值,表L的长度减1

Status ListDelete_Sq(SqList& L, int i, ElemType& e)

{

if (i<1 || i>L.length)

return ERROR;

ElemType* p = &(L.elem[i - 1]);

e = *p;

ElemType* q = L.elem + L.length - 1;

for (++p; p <= q; ++p)

*(p - 1) = *p;

--L.length;

return OK;

}

//访问线性表中的数据元素

Status visit(ElemType i)

{

if (cout << i << " ")

return TRUE;

else

return FALSE;

}

//一次对线性表L的每个数据元素调用函数visit();一旦visit()失败,则操作失败

Status ListTraverse_Sq(SqList L, Status (*visit)(ElemType))

{

for (int i = 1; i <= L.length; ++i)

if (!visit(*L.elem++))

return ERROR;

return OK;

}

主程序为:

#include"SqList.h"

void MergeList_Sq(SqList La, SqList Lb, SqList& Lc)

{

ElemType* pa = La.elem;

ElemType* pb = Lb.elem;

Lc.elem = (ElemType*)malloc(sizeof(ElemType));

if (!Lc.elem)

exit(OVERFLOW);

ElemType* pc = Lc.elem;

Lc.length = La.length + Lb.length;

Lc.listsize = La.listsize + Lb.listsize;

ElemType* pa_last = La.elem + La.length - 1;

ElemType* 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++;

while (pb <= pb_last)

*pc++ = *pb++;

}

void main(void)

{

int i = 1, j = 1;

int a[] = { 3,5,8,11 };

int b[] = { 2,6,8,9,11,15,20 };

SqList La, Lb, Lc;

InitList_Sq(La);

for (i = 0; i < 4; ++i)

ListInsert_Sq(La, j++, a[i]);

cout << "线性表La的数据元素按非递减有序排列为:" << endl;

ListTraverse_Sq(La, visit);

cout << endl;

InitList_Sq(Lb);

for (i = 0, j = 1; i < 7; ++i)

ListInsert_Sq(Lb, j++, b[i]);

cout << "线性表Lb的数据元素按非递减有序排列为:" << endl;

ListTraverse_Sq(Lb, visit);

cout << endl;

cout << "将表La和Lb合并,结果仍按非递减有序排列,结果为:" << endl;

MergeList_Sq(La, Lb, Lc);

ListTraverse_Sq(Lc, visit);

cout << endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: