1.数据结构--线性表之数组实现

来源:互联网 发布:软件开发分录 编辑:程序博客网 时间:2024/04/29 18:39
#include <iostream>  using namespace std;#define MAXSIZE 100 //顺序表可能达到的最大长度  //函数结果状态  #define OK 1  #define OVERFLOW -2  #define ERROR 0  typedef int Status;typedef int ElemType;typedef struct{ElemType *elem; //存储空间的基地址  int length; //当前的长度  }SqList;/************************************************************************//* 1.顺序表的初始化(1)为顺序表动态分配一个预定义大小的数组,使elem指向这段空间的基地址。(2)为表的当前长度设置为0。*//************************************************************************/Status InitList_Sq(SqList &L){//构造一个空的线性表L  L.elem = new ElemType[MAXSIZE];if (!L.elem)exit(OVERFLOW);L.length = 0;return OK;}/************************************************************************//*2. 销毁线性表*//************************************************************************/void DestroyList(SqList &L){if (L.elem)delete[]L.elem; //释放存储空间  }/************************************************************************//*3. 清空线性表*//************************************************************************/void ClearList(SqList &L){L.length = 0; //将线性表的长度设置为0  }/************************************************************************//*4. 求线性表的长度*//************************************************************************/int GetLength(SqList L){return (L.length);}/************************************************************************//*5. 判断线性表是否为空*//************************************************************************/int IsEmpty(SqList L){return L.length ? 0 : 1; //为空返回1,不为空返回0  }/************************************************************************//*6. 获取线性表L中的某个数据元素的内容*//************************************************************************/int GetElem(SqList L, int i, ElemType &e) //线性表第i个位置的元素的值,结果保存的e中  {if (i < 1 || i > L.length)return ERROR;e = L.elem[i - 1];return OK;}/************************************************************************//*7. 查找值为e的元素的位置*//************************************************************************/int LocateELem(SqList L, ElemType e){for (int i = 0; i < L.length; ++i)if (L.elem[i] == e) return i + 1;return 0;}/************************************************************************//*8. 在线性表L中第i个数据元素之前插入数据元素e *//************************************************************************/Status ListInsert_Sq(SqList &L, int i, ElemType e){if (i < 1 || i > L.length + 1)return ERROR;if (L.length == MAXSIZE)return ERROR;    //当前存储空间已满    for (int k = L.length - 1; k >= i - 1; --k)L.elem[k + 1] = L.elem[k];L.elem[i - 1] = e;++L.length;return OK;}/************************************************************************//*9. 将线性表L中的第i个元素删除 *//************************************************************************/Status ListDelete_Sq(SqList &L, int i){if (i < 1 || i > L.length)return ERROR;if (IsEmpty(L))return ERROR;    //当前表已经为空  for (int k = i; k <= L.length - 1; ++k)L.elem[k - 1] = L.elem[k];--L.length;return OK;}//打印线性表  void PrintOut(SqList &L){int flag = 0; //标记是否是第一项  for (int i = 0; i < L.length; ++i){if (flag == 0) flag = 1;else cout << " ";cout << L.elem[i];}cout << endl;}void MergeList_Sq(SqList LA, SqList LB, SqList &LC) //已知顺序有序表LA和LB的元素按照值非递减排列,归并LA和LB得到新的顺序有序表LC,LC的元素也按值非递减排列{ElemType * pa = LA.elem;ElemType * pb = LB.elem;LC.length = LA.length + LB.length;LC.elem = new ElemType[LC.length];ElemType * pc = LC.elem;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++; //依次“摘取”两个表中值较小的结点插入到LC表的最后else *pc++ = *pb++;}while (pa <= pa_last)*pc++ = *pa++;while (pb <= pb_last)*pc++ = *pb++;}int main(){SqList L1, L2;InitList_Sq(L1);ListInsert_Sq(L1, 1, 1);ListInsert_Sq(L1, 2, 2);ListInsert_Sq(L1, 3, 3);PrintOut(L1);InitList_Sq(L2);ListInsert_Sq(L2, 1, 1);ListInsert_Sq(L2, 2, 5);ListInsert_Sq(L2, 3, 7);PrintOut(L2);SqList L3;MergeList_Sq(L1, L2, L3);PrintOut(L3);DestroyList(L1);DestroyList(L2);DestroyList(L3);}

0 0
原创粉丝点击