• 线性表——顺序表的基本操作


    线性表的顺序存储结构及其基本操作的实现

      1 /*
      2   Name: 顺序表的实现
      3   Author: SUNPEISHUO
      4   Date: 2017/11/03 22:00 
      5 */
      6 #ifndef SQLIST_H_INCLUDED
      7 #define SQLIST_H_INCLUDED
      8 #include "ds.h" //for Status,OK ...
      9 #ifndef ElemType
     10 #define ElemType int /* 数据元素类型默认为 int */
     11 #define ELEMTYPE_TAG
     12 #endif
     13 /**********************************************************
     14 *  顺序表的存储结构定义 
     15 ***********************************************************/
     16 #define LIST_INIT_SIZE 100 /* 存储空间初始分配容量 */
     17 #define LISTINCREMENT 10 /* 存储空间分配的增量 */
     18    typedef struct {
     19        ElemType *elem;    //存储空间基址
     20        int length;        //当前长度 
     21        int listsize;      //当前已分配的存储空间(元素个数) 
     22    } SqList;
     23 
     24 /**********************************************************
     25 *  顺序表的基本操作声明
     26 ***********************************************************/
     27 
     28 //创建并初始化为空表 
     29    Status InitList(SqList &L);
     30 //销毁整个表(从此之后不再可用) 
     31    Status DestroyList(SqList &L);
     32 //将表L置空
     33    Status ClearList(SqList &L); 
     34 //判断表L是否为空表 
     35    bool ListEmpty(SqList L);
     36 //求表L的长度 
     37    int ListLength(SqList L);
     38 //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR 
     39    Status GetElem(SqList L, int i, ElemType &e);
     40     template <typename T> bool equal(T a, T b)
     41     {
     42     return a==b;
     43     }
     44 //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 
     45    int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType)=equal<ElemType>);
     46 //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
     47    Status ListInsert(SqList &L, int i, ElemType e);
     48 //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR 
     49    Status ListDelete(SqList &L, int i, ElemType &e);
     50 //遍历表L,对每个元素调用visit(x). 
     51    Status ListTraverse(SqList L, Status (*visit)(ElemType));
     52  
     53 /**********************************************************
     54 *  顺序表的基本操作的实现
     55 ***********************************************************/
     56 
     57 //创建并初始化为空表 
     58  Status InitList(SqList &L)
     59  {   L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
     60     if(!L.elem)  return ERROR;
     61     L.length=0;
     62     L.listsize=LIST_INIT_SIZE;
     63     return OK;
     64  }
     65 
     66 //销毁整个表(从此之后不再可用) 
     67 Status DestroyList(SqList &L)
     68  {
     69     return ERROR;  
     70  }
     71 
     72 //将表L置空 
     73 Status ClearList(SqList &L)
     74 {
     75   L.length=0;
     76   return OK;
     77 }
     78 
     79 //判断表L是否为空表 
     80 bool ListEmpty(SqList L)
     81 {
     82   if(L.length==0) return true;
     83     else return false;
     84 }
     85 
     86 //求表L的长度 
     87 int ListLength(SqList L)
     88 {
     89   return L.length;
     90 }
     91 
     92 //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR 
     93 Status GetElem(SqList L, int i, ElemType &e)
     94 { if(i<1||i>L.length) return ERROR;
     95      e=L.elem[i-1];
     96      return OK;
     97 }
     98    
     99 //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 ,compare(a,b) 为比较函数,匹配时返回true,否则返回false 
    100  
    101 int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType))
    102 {
    103     for (int j=0; j<L.length; j++)
    104         if ( compare(L.elem[j],e) )  return j;
    105     return 0;
    106 }
    107 
    108 
    109 //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
    110 Status ListInsert(SqList &L, int i, ElemType e)
    111 {
    112     if(i<0||i>L.length+1) return ERROR;
    113     if(L.length>=L.listsize)
    114     {
    115         ElemType* newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
    116         if(!newbase) return ERROR;
    117         L.elem=newbase;
    118         L.listsize=L.listsize+LISTINCREMENT;
    119     }
    120        ElemType* q=&(L.elem[i-1]);
    121     for(ElemType* p=&(L.elem[L.length-1]);p>=q;--p)
    122      *(p+1)=*p;
    123       *q=e;
    124       L.length++;
    125       return OK;
    126 
    127 }
    128 
    129 //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR 
    130 Status ListDelete(SqList &L, int i, ElemType &e)
    131 {   if(i<1||i>L.length) return ERROR;
    132     ElemType* p=&(L.elem[i-1]);
    133      e=*p;
    134     for(ElemType* q=&(L.elem[L.length-1]);p<=q;p++)
    135      *p=*(p+1);
    136         L.length--;
    137      return OK;
    138 }
    139 
    140 //遍历表L,对每个元素调用visit(x). 
    141 Status ListTraverse(SqList L, Status (*visit)(ElemType))
    142 { 
    143     for (int j=0; j<L.length; j++)
    144         if ( ! visit(L.elem[j]) )  return ERROR;
    145     return OK;
    146 }
    147 
    148 #ifdef ELEMTYPE_TAG
    149 #undef ElemType
    150 #undef ELEMTYPE_TAG
    151 #endif
    152 #endif  // SQLIST_H_INCLUDED
  • 相关阅读:
    Sqlserver 批量数据更改
    mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录
    SQLServer 与 MySQL
    MySQL 行号(类似SQLServer的row_number())
    c# 字符串排序 (面试题)
    c# 多线程里面创建byte数组发生内存溢出异常求解
    c# 遇到的问题,求解?
    solr-4.10.3.tgz.tgz下载
    VMware虚拟机克隆或复制linux后无法上网的解决方案
    通配符的匹配很全面, 但无法找到元素 'dubbo:application' 的声明。
  • 原文地址:https://www.cnblogs.com/spsglz/p/7780898.html
Copyright © 2020-2023  润新知