线性表之顺序存储结构

线性表之顺序存储结构

线性表的顺序存储是指用一组地址连续的存储单元一次存储线性表的数据元素。在C语言中,可以使用动态数组来实现线性表的顺序存储。

定义:

   1: #define LIST_INIT_SIZE     100
   2: #define LIST_INCREMENT    10
   3:  
   4: typedef struct {
   5:     ElemType     *elem;
   6:     int         length;
   7:     int         listsize;    
   8: }SqList;
操作:
   1: InitList(L);                          /* 构造线性表 */
   2: DestroyList(L);  /* 销毁线性表 */  
   3: ClearList(L);                        /* 将线性表置空 */
   4: ListEmpty(L);                        /* 判断线性表是否为空 */
   5: ListLength(L);                       /* 返回线性表长度 */
   6: GetElem(L, i, &e);                   /* 用e返回L中第i个元素 */
   7: LocateElem(L, e, compare());         /* 返回L中第一个与e满足关系compare()的元素 */
   8: PriorElem(L, cur_e, &pre_e);         /* 返回cur_e的前驱元素 */
   9: NextElem(L, cur_e, &next_e);         /* 返回cur_e的后继元素 */
  10: ListInsert(L, i, e);                 /* 在L中位置i之前插入元素e */
  11: ListDelete(L, i, &e);                /* 删除L中第i个元素 */
  12: ListTraverse(L, visit());            /* 对每个元素调用visit() */
实现:
   1: typedef int ElemType;
   2:  
   3: #define LIST_INIT_SIZE     100
   4: #define LIST_INCREMENT    10
   5:  
   6: typedef struct {
   7:     ElemType     *elem;
   8:     int         length;
   9:     int         listsize;    
  10: }SqList;
  11:  
  12: int InitList(SqList *L)
  13: {
  14:     L->elem = (ElemType *)malloc(sizeof(ElemType) * LIST_INIT_SIZE);
  15:     if (!L->elem)
  16:         return -1;
  17:     L->length = 0;
  18:     L->listsize = LIST_INIT_SIZE;
  19:     
  20:     return 0;
  21: }
  22:  
  23: void DestroyList(SqList *L)
  24: {
  25:     free(L->elem);
  26:     L->length = 0;
  27:     L->listsize = 0;
  28: }
  29:  
  30: void ClearList(SqList *L)
  31: {
  32:     L->length = 0;
  33: }
  34:  
  35: bool ListEmpty(SqList *L)
  36: {
  37:     return (L->length == 0);
  38: }
  39:  
  40: int ListLength(SqList *L)
  41: {
  42:     return L->length;
  43: }
  44:  
  45: int GetElem(SqList *L, int i, ElemType *e)
  46: {
  47:     if (i < 0 || i >= L->length)
  48:         return -1;
  49:     
  50:     *e = L->elem[i];
  51:     
  52:     return 0;    
  53: }
  54:  
  55: int LocateElem(SqList *L, ElemType e, bool (*compare)(ElemType a, ElemType b))
  56: {
  57:     int i;
  58:     
  59:     for (i = 0; i < L->length; ++i) {
  60:         if (compare(L->elem[i], e))
  61:             return i;
  62:     }    
  63:     
  64:     return -1;
  65: }
  66:  
  67: int PriorElem(SqList *L, ElemType e, ElemType *pre_e)
  68: {
  69:     int i;
  70:     
  71:     for (i = 1; i < L->length; ++i) {
  72:         if (e == L->elem[i]) {
  73:             *pre_e = L->elem[i-1];
  74:             return 0;
  75:         }
  76:     }
  77:     
  78:     return -1;
  79: }
  80:  
  81: int NextElem(SqList *L, ElemType e, ElemType *next_e)
  82: {
  83:     int i;
  84:     
  85:     for (i = 0; i < L->length - 1; ++i) {
  86:         if (e == L->elem[i]) {
  87:             *next_e = L->elem[i+1];
  88:             return 0;
  89:         }
  90:     }
  91:     
  92:     return -1;
  93: }
  94:  
  95: int ListInsert(SqList *L, int i, ElemType e)
  96: {
  97:     if (i < 0 || i > L->length) {
  98:         return -1;
  99:     }
 100:     
 101:     if (L->length >= L->listsize) {
 102:         ElemType *newbase = (ElemType *)realloc(L->elem, sizeof(ElemType) * (L->listsize + LIST_INCREMENT));
 103:         if (!newbase) {
 104:             return -1;
 105:         }
 106:         L->elem = newbase;        
 107:         L->listsize += LIST_INCREMENT;
 108:     }
 109:     
 110:     ElemType *p, *q;
 111:     q = L->elem + i;
 112:     for (p = L->elem + L->length - 1; p >= q; --p)
 113:         *(p+1) = *p;
 114:         
 115:     *q = e;    
 116:     L->length += 1;
 117:     
 118:     return 0;    
 119: }
 120:  
 121: int ListDelete(SqList *L, int i, ElemType *e)
 122: {
 123:     if (i < 0 || i >= L->length) {
 124:         return -1;
 125:     }    
 126:     
 127:     *e = L->elem[i];
 128:     
 129:     ElemType *p;
 130:     for (p = L->elem + i; p < L->elem + L->length - 1; ++p) {
 131:         *p = *(p+1);        
 132:     }
 133:     L->length -= 1;
 134:     
 135:     return 0;
 136: }
 137:  
 138: int ListTraverse(SqList *L, int (*visit)(ElemType e))
 139: {
 140:     int i, ret;
 141:     
 142:     for (i = 0; i < L->length; ++i) {
 143:         ret = visit(L->elem[i]);
 144:         if (ret != 0)
 145:             return ret;
 146:     }
 147:         
 148:     return 0;        
 149: }
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值