首页 > 代码库 > 线性表实现——自动扩容实现

线性表实现——自动扩容实现

  1 #include <stdio.h>  2 #include <stdlib.h>  3 #include <string.h>  4   5 #define OK 1  6 #define ERROR 0  7   8 typedef struct {  9     int x; 10     int y; 11 }Point; 12  13 typedef struct { 14     Point *pt; 15     int length; 16     int size; 17 }AutoArrList; 18  19  //声明线性表所具有的方法 20 AutoArrList *CreateArrList(int nLength)      //创建长为 nArrLength 的线性表 21 { 22     AutoArrList * l=(AutoArrList*)malloc(sizeof(AutoArrList)); 23     if (l == NULL) 24         return NULL; 25     Point * p= (Point*)calloc(nLength,sizeof(Point)); 26     if (p == NULL) 27     { 28         free(l); 29         return NULL; 30     } 31          32     l->pt = p; 33     l->length = 0; 34     l->size = nLength; 35  36     return l; 37 } 38 void DestroyArrList(AutoArrList *pArrList)    //销毁线性表 pArrList 39 { 40     if (pArrList == NULL) 41         return; 42     free(pArrList->pt); 43     free(pArrList); 44     return; 45 } 46 void ClearArrList(AutoArrList *pArrList)      //置空线性表 pArrList 47 { 48     //if (pArrList == NULL) 49     //    return; 50     //pArrList->pt = NULL; 51     pArrList->length = 0; 52     return; 53 } 54 int IsEmptyArrList(AutoArrList *pArrList)     //检测线性表是否为空 55 { 56     if (pArrList->length == 0) 57         return 1; 58     return 0; 59 } 60 int GetArrListLength(AutoArrList *pArrList)   //获取线性表长度 61 { 62     return pArrList->length; 63 } 64 int GetArrListSize(AutoArrList *pArrList)    //获取线性表总容量 65 { 66     return pArrList->size; 67 } 68 int GetArrListElement(AutoArrList *pArrList, int n, Point *pt)  //获取线性表中第n个元素 69 { 70     if ((pArrList->length == 0) || (n < 1) || (n > pArrList->length)) 71         return ERROR; 72     pt->x = pArrList->pt[n - 1].x; 73     pt->y = pArrList->pt[n - 1].y; 74  75     return OK; 76 } 77 int FindElement(AutoArrList *pArrList, int nPos, Point *pt)      //从 nPos 起查找 pt 第一次出现的位置 78 { 79     if ((pArrList->length == 0) || (nPos < 1) || (nPos > pArrList->length)) 80         return ERROR; 81     int i; 82     for (i = nPos - 1; i < pArrList->length; i++) 83     { 84         if ((pArrList->pt[i].x == pt->x) && (pArrList->pt[i].y == pt->y)) 85             return i + 1; 86     } 87     return ERROR; 88 } 89 int GetPriorElement(AutoArrList *pArrList, Point *pt, Point *prior_pt)   //获取 pt 的前驱节点到 prior_pt 90 { 91     if (pArrList->length == 0) 92         return ERROR; 93     int i; 94     for (i = 1; i < pArrList->length; i++) 95     { 96         if ((pArrList->pt[i].x == pt->x) && (pArrList->pt[i].y == pt->y)) 97         { 98             prior_pt->x = pArrList->pt[i].x; 99             prior_pt->y = pArrList->pt[i].y;100             return OK;101         }            102     }103     return ERROR;104 }105 int GetNextElement(AutoArrList *pArrList, Point *pt, Point *next_pt)    //获取 pt 的后继节点到 next_pt106 {107     if (pArrList->length == 0)108         return ERROR;109     int i;110     for (i = 0; i < pArrList->length-1; i++)111     {112         if ((pArrList->pt[i].x == pt->x) && (pArrList->pt[i].y == pt->y))113         {114             next_pt->x = pArrList->pt[i].x;115             next_pt->y = pArrList->pt[i].y;116             return OK;117         }118     }119     return ERROR;120 }121 int AppendToArrList(AutoArrList *pArrList, Point *pt)           //将 pt 添加到线性表末尾处122 {123     if (pArrList->length == pArrList->size)124     {125         Point *p = (Point *)calloc(pArrList->length * 2, sizeof(Point));126         memcpy(p, pArrList->pt, pArrList->length);127         pArrList->size = pArrList->length * 2;128         free(pArrList->pt);129         pArrList->pt = p;130     }131     pArrList->pt[pArrList->length].x = pt->x;132     pArrList->pt[pArrList->length].y = pt->y;133     pArrList->length++;134     return OK;135 }136 int InsertToArrList(AutoArrList *pArrList, int nPos, Point *pt) //将 pt 插入到 nPos 处137 {138     int i;139     if ((pArrList->length == 0) || (nPos < 1) || (nPos > pArrList->length))140         return ERROR;141     if (pArrList->length == pArrList->size)142     {143         Point *p = (Point *)calloc(pArrList->length * 2, sizeof(Point));144         memcpy(p, pArrList->pt, pArrList->length);145         pArrList->size = pArrList->length * 2;146         free(pArrList->pt);147         pArrList->pt = p;148     }149     if (nPos <= pArrList->length)150     {151         for (i = pArrList->length; i > nPos - 1; i--)152         {153             pArrList->pt[i].x = pArrList->pt[i - 1].x;154             pArrList->pt[i].y = pArrList->pt[i - 1].y;155         }156     }157     pArrList->pt[nPos-1].x = pt->x;158     pArrList->pt[nPos-1].y = pt->y;159     pArrList->length++;160     return OK;161 }162 int DeleteFromArrList(AutoArrList *pArrList, int nPos)            //删除线性表上位置为 nPos 的元素163 {164     int i;165     if ((pArrList->length == 0) || (nPos < 1) || (nPos > pArrList->length))166         return ERROR;167     if (nPos < pArrList->length)168     {169         for (i = nPos - 1; i < pArrList->length - 1; i++)170         {171             pArrList->pt[i].x = pArrList->pt[i + 1].x;172             pArrList->pt[i].y = pArrList->pt[i + 1].y;173         }174     }175     pArrList->length--;176     return OK;177 }178 void ForEachArrList(AutoArrList *pArrList, void(*func)(Point *pt))             //对线性表中每个元素执行 func 函数179 {180     if (pArrList->length == 0)181         return ;182     int i;183     for (i = 0; i < pArrList->length; i++)184     {185         func(&pArrList->pt[i]);186     }187 }188 int ArrListCpy(AutoArrList *pArrListDest, AutoArrList *pArrListSrc)    //将线性表 pArrListSrc 复制到 pArrListDest189 {190     if (pArrListSrc->length == 0)191         return ERROR;192     if (pArrListSrc->length > pArrListDest->size)193     {194         free(pArrListDest->pt);195         Point *p = (Point *)malloc(pArrListSrc->length *sizeof(Point));196         pArrListDest->pt = p;197         pArrListDest->size = pArrListSrc->length;198     }199     memcpy(pArrListDest->pt, pArrListSrc->pt, pArrListSrc->length * sizeof(Point));200     pArrListDest->length = pArrListSrc->length;201     return OK;202 }203 int ArrListCat(AutoArrList *pArrListDest, AutoArrList *pArrListSrc)    //将线性表 pArrListSrc 连接到 pArrListDest 的末尾204 {205     if (pArrListSrc->length == 0)206         return OK;207     if (pArrListDest->size < (pArrListDest->length + pArrListSrc->length))208     {209         int len = pArrListDest->length + pArrListSrc->length;210         Point *p = (Point *)calloc(len ,sizeof(Point));211         memcpy(p, pArrListDest->pt, pArrListDest->length * sizeof(Point));212         free(pArrListDest->pt);213         pArrListDest->pt = p;214         pArrListDest->size = len;215     }216     memcpy(pArrListDest + pArrListDest->length, pArrListSrc->pt, pArrListSrc->length * sizeof(Point));217     pArrListDest->length += pArrListSrc->length;218     return OK;219 }220 void display(Point *pt)221 {222        printf("(%d,%d) ", pt->x, pt->y);223 }

 

线性表实现——自动扩容实现