基于顺序表的两个非递减有序表的合并
来源:互联网 发布:网络砍价师 编辑:程序博客网 时间:2024/04/28 04:12
头文件: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;
#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;
}
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;
}
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;
}
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;
}
Status ListEmpty_Sq(SqList L)
{
if (0 == L.length)
return TRUE;
else
return FALSE;
}
//返回线性表L中数据元素个数
int ListLength_Sq(SqList L)
{
return L.length;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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 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;
}
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;
}
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 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;
}
{
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;
}
0 0
- 基于单链表的两个非递减有序表的合并
- 基于顺序表的两个非递减有序表的合并
- 两个非递减有序表的合并_Page_39
- 将两个有序表合并成一个非递减的有序表算法
- 非递减顺序表的合并
- 非递减顺序表的合并
- 顺序表的非递减数列合并
- 将两个非递减的有序链表合并为一个非递增的有序链表
- [数据结构]单链表 合并两个非递减有序表成新表也是非递减表
- 【实验】两个有序顺序表的合并
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- 数组表示的线性表(顺序表)的基本操作,以及合并两个非递减数组线性表
- 非递减合并两个有序单链表
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 有两个顺序表LA,LB,其元素均为非递减有序排列,编写算法将它们合并成一个顺序表LC,要求LC也是非递减有序排列。
- 两个非递减数组的合并
- 链式表的非递减数列合并
- 【C语言版数据结构】线性表的链式表示,并且实现合并两个非递减有序排列到新的线性表
- 尾部的零
- 数据结构实践项目之校园导航系统
- nexus中自定义仓库
- C++数组
- SqlServer与Oracle语法差异
- 基于顺序表的两个非递减有序表的合并
- 数据库连接
- DHT 爬虫的学习记录
- 笔记
- 发布几个PDF小工具
- 条件编译符号与发布
- 【Docker技术入门与实战】存出和载入镜像
- Cacti 访问 URL的变更
- window向linux传文件