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

来源:互联网 发布:网络砍价师 编辑:程序博客网 时间: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;

//构造一个空的线性表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;
}

0 0