数据结构之表(1)顺序表的实现

SqList.h

   1: # ifndef _SQLIST_H_
   2: # define _SQLIST_H_
   3: /************************************************************************/
   4: /* 存储结构的定义                                                        */
   5: /************************************************************************/
   6: # define ElemType int  /*表中存储数据的类型*/
   7: # define LIST_INIT_SIZE 100 /*表的初始存储空间*/
   8: # define LISTINCREMENT 20 /*表存储空间的增量 */
   9:  
  10: typedef struct {
  11:     ElemType * elem ; /*基址的指针*/
  12:     int length ; /*表的长度,表中元素的个数*/
  13:     int size ; /*表的容量*/
  14: }SqList;
  15:  
  16: /************************************************************************/
  17: /* 表的基本操作                                                          */
  18: /************************************************************************/
  19:  
  20: void InitList(SqList * sqlist) ; /*初始化表*/
  21:  
  22: void DestoryList(SqList * sqlist) ; /*销毁表,释放存储空间*/
  23:  
  24: void ClearList(SqList * sqlist) ; /*将表置空*/
  25:  
  26: int IsEmpty(SqList * sqlist) ; /*判断表是否为空,空则返回1,否则返回0 */
  27:  
  28: int Length(SqList * sqlist) ; /*返回表的长度*/
  29:  
  30: ElemType GetElem(SqList * sqlist,int i) ; /*返回表中第i个元素*/
  31:  
  32: /*判断e是否为表中的元素,是则返回元素在表中的位置,否则返回-1*/
  33: int LocateElem(SqList * sqlist,ElemType e) ; 
  34:  
  35: /*用pre_e获取元素e的前驱,返回值i为前驱在表中位置*/
  36: /*如果e不在表中,返回-1 */
  37: /*如果e为表中的第一个元素,返回-2*/
  38: int PriorElem(SqList * sqlist,ElemType e,ElemType * pre_e) ;
  39:  
  40: /*用next_e获取e的后继,返回值i为后继在表中的位置*/
  41: /*如果e不是表中元素,返回-1*/
  42: /*如果e为表中的最后一个元素,返回-2*/
  43: int NextElem(SqList * sqlist,ElemType e ,ElemType * next_e) ;
  44:  
  45: /*在位置i处插入元素e,成功则返回表的长度,否则返回0*/
  46: int Insert(SqList * sqlist,ElemType e , int i ) ; 
  47:  
  48: /*删除表中的元素e,成功返回1,否则返回0*/
  49: int Delete(SqList * sqlist,ElemType e) ;
  50:  
  51: /*遍历*/
  52: void traverse(SqList * sqlist) ;
  53:  
  54: # endif

SqList.c

   1: # include "SqList.h"
   2: # include <stdlib.h>
   3: # include <stdio.h>
   4:  
   5: /*初始化表*/
   6: void InitList(SqList * sqlist) {
   7:     sqlist->elem = (ElemType *) malloc(LIST_INIT_SIZE) ;
   8:     if(!sqlist->elem)
   9:         exit(0) ;
  10:     sqlist->length = 0 ;
  11:     sqlist->size = LIST_INIT_SIZE ;
  12: }
  13:  
  14: /*销毁表,释放存储空间*/
  15: void DestoryList(SqList * sqlist) {
  16:     if(sqlist->elem)
  17:         free(sqlist->elem) ;
  18: }
  19:  
  20: /*将表置空*/
  21: void ClearList(SqList * sqlist) {
  22:     if(sqlist->elem)
  23:         sqlist->length = 0 ;
  24: }
  25:  
  26: /*判断表是否为空,空则返回1,否则返回0 */
  27: int IsEmpty(SqList * sqlist) {
  28:     if(sqlist->elem) {
  29:         if(sqlist->length > 0)
  30:                 return 0 ;
  31:             else
  32:                 return 1 ;
  33:     }
  34:     else
  35:         return -1 ;
  36:     
  37: } 
  38:  
  39: /*返回表的长度*/
  40: int Length(SqList * sqlist) {
  41:     if(sqlist->elem)
  42:         return sqlist->length ;
  43:     else
  44:         return -1 ;
  45: } 
  46:  
  47: /*返回表中第i个元素*/
  48: ElemType GetElem(SqList * sqlist,int i) {
  49:     if( (i-1) > sqlist->length || i < 0) 
  50:         return -1000 ;
  51:     return *(sqlist->elem + (i-1)) ;
  52: }
  53:  
  54: /*判断e是否为表中的元素,是则返回元素在表中的位置,否则返回-1*/
  55: int LocateElem(SqList * sqlist,ElemType e) {
  56:     int i ;
  57:     for( i = 0 ; i < sqlist->length ; i ++) {
  58:         if( e == *(sqlist->elem + i) )
  59:             return i ;
  60:     }
  61:     return -1 ;
  62: } 
  63:  
  64: /*用pre_e获取元素e的前驱,返回值i为前驱在表中位置*/
  65: /*如果e不在表中,返回-1 */
  66: /*如果e为表中的第一个元素,返回-2*/
  67: int PriorElem(SqList * sqlist,ElemType e,ElemType * pre_e) {
  68:     int local ; //元素e在表中的位置
  69:     local = LocateElem(sqlist,e) ;
  70:     if(local == -1) //表中不存在该元素
  71:         return -1 ;
  72:     if(local == 0) //表中的第一个元素
  73:         return -2 ;
  74:     *pre_e = *(sqlist->elem + (local - 1)) ;
  75:     return (local - 1) ;
  76: }
  77:  
  78: /*用next_e获取e的后继,返回值i为后继在表中的位置*/
  79: /*如果e不是表中元素,返回-1*/
  80: /*如果e为表中的最后一个元素,返回-2*/
  81: int NextElem(SqList * sqlist,ElemType e ,ElemType * next_e) {
  82:     int local ;
  83:     local = LocateElem(sqlist,e) ;
  84:     if(local == -1) //表中不存在该元素
  85:         return -1 ;
  86:     if(local == 0) //表中的第一个元素
  87:         return -2 ;
  88:     *next_e = *(sqlist->elem + (local + 1)) ;
  89:     return (local + 1) ;
  90: }
  91:  
  92: /*在位置i处插入元素e,成功则返回1,否则返回0*/
  93: int Insert(SqList * sqlist,ElemType e , int i ) {
  94:     ElemType * temp ;
  95:     int cursor ;
  96:     if(sqlist->length >= sqlist->size) {
  97:         temp = (ElemType *)realloc(sqlist->elem,(LIST_INIT_SIZE + LISTINCREMENT) * sizeof(ElemType) ) ;
  98:         if(!temp)
  99:             exit(0) ;
 100:         else {
 101:             sqlist->elem = temp ;
 102:             sqlist->size += LISTINCREMENT ;
 103:         }
 104:     }
 105:  
 106:     for(cursor = sqlist->length ; cursor >= i ; cursor --) {
 107:         *(sqlist->elem + (cursor + 1)) = *(sqlist->elem + cursor) ;
 108:     }
 109:  
 110:     *(sqlist->elem + i) = e ;
 111:  
 112:     return ++ sqlist->length ;
 113: } 
 114:  
 115: /*删除表中的元素e,成功返1,否则返回0*/
 116: int Delete(SqList * sqlist,ElemType e) {
 117:     int local ; 
 118:     local = LocateElem(sqlist,e) ;
 119:     if(local == -1) //表中不存在该元素
 120:         return 0 ;
 121:  
 122:     for(; local < sqlist->length ; local++) 
 123:         *(sqlist->elem + local) = *(sqlist->elem + (local - 1)) ;
 124:  
 125:     --sqlist->length ;
 126:     return 1 ;
 127: }
 128:  
 129: /*遍历*/
 130: void traverse(SqList * sqlist) {
 131:     int i = 0 ;
 132:     if(!sqlist->elem || sqlist->length == 0)
 133:         return ;
 134:     for( ; i < sqlist->length ;i ++)
 135:         printf("%4d",*(sqlist->elem + i)) ;
 136:     printf("\n") ;
 137: }
posted on 2011-04-22 18:24  codmer  阅读(2049)  评论(1编辑  收藏  举报