zoukankan      html  css  js  c++  java
  • 线性表顺序存储实现-动态数组

      1 // 2018-06-22
      2 // 线性表顺序存储实现-动态数组
      3 #include<stdio.h>
      4 #include<stdlib.h>
      5 
      6 #define LIST_INIT_SIZE 5  // 符号常量 ,线性表存储空间的初试分配量
      7 #define LIST_INCREMENT 10 // 符号常量 ,线性表存储空间的分配增量
      8 
      9 #define OK 1
     10 #define ERROR 0
     11 #define TRUE 1
     12 #define FALSE 0
     13 
     14 typedef int ElemType;
     15 typedef int Status;
     16 
     17 typedef struct sqList
     18 {
     19     ElemType *elem;    // 存储空间基地址
     20     int length;        // 线性表当前长度
     21     int listsize;    // 当前分配的存储容量
     22 }SqList;
     23 
     24 
     25 /*
     26 Status InitList(SqList *L);
     27 Status ListInsert(SqList *L,int i,ElemType e);
     28 Status ListTraverse(SqList L);
     29 Status ListEmpty(SqList L);
     30 Status ClearList(SqList *L);
     31 Status GetElem(SqList L,int i,ElemType *e);
     32 int LocateElem(SqList L,ElenType e);
     33 Status ListDelete(SqList *L,int i,ElemType *e);
     34 int ListLength(SqList L);
     35 void UnionL(SqList *La,SqList Lb);
     36 */
     37 
     38 // 初始化线性表
     39 Status InitList(SqList *L)
     40 {
     41     L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
     42     if (!(L->elem))
     43         return ERROR;
     44     L->length = 0;                     // 空表长度为0
     45     L->listsize = LIST_INIT_SIZE;     // 初始化存储容量
     46 
     47     return OK;
     48 }
     49 
     50 // 在 L 中第 i 个位置插入新的数据元素 e ,L 的长度增加 1
     51 Status ListInsert(SqList *L, int i, ElemType e)
     52 {
     53     ElemType *newbase;
     54     int k;
     55 
     56     if (L->length == L->listsize)
     57     {
     58         // realloc(void *__ptr, size_t __size)
     59         // 更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小
     60         newbase = (ElemType *)realloc(L->elem, (L->listsize + LIST_INCREMENT) * sizeof(ElemType));
     61         if (!newbase)
     62             return ERROR;
     63         L->elem = newbase;
     64         L->listsize += LIST_INCREMENT;
     65     }
     66 
     67     if (!(i >= 1 && i <= L->length + 1))
     68         return ERROR;
     69 
     70     if (i != L->length + 1)    // 插入的位置不在表尾
     71     {
     72         for (k = L->length - 1; k >= i - 1; k--)
     73             *(L->elem + k + 1) = *(L->elem + k);
     74     }
     75     *(L->elem + i - 1) = e;
     76     L->length++;
     77     return OK;
     78 }
     79 
     80 Status ListTraverse(SqList L)
     81 {
     82     int i;
     83     for (i = 0; i < L.length; i++)
     84     {
     85         printf("%d ", *(L.elem++));
     86     }
     87     printf("
    ");
     88     return OK;
     89 }
     90 
     91 Status ListEmpty(SqList L)
     92 {
     93     if (L.length == 0)
     94         return OK;
     95     else
     96         return ERROR;
     97 }
     98 
     99 Status ClearList(SqList *L)
    100 {
    101     L->length = 0;
    102     return OK;
    103 }
    104 
    105 Status GetElem(SqList L, int i, ElemType *e)
    106 {
    107     if (L.length == 0) return ERROR;
    108     if (!(i >= 1 && i < L.length)) return ERROR;
    109     *e = *(L.elem + i - 1);
    110     return OK;
    111 }
    112 
    113 // 返回L中第1个与e满足关系的数据元素的位序
    114 int LocateElem(SqList L, ElemType e)
    115 {
    116     int i;
    117     if (L.length == 0)
    118         return 0;
    119     for (i = 0; i < L.length; i++)
    120     {
    121         if (*(L.elem + i) == e)
    122             return i + 1;
    123     }
    124     return 0;
    125 }
    126 
    127 Status ListDelete(SqList *L, int i, ElemType *e)
    128 {
    129     int k;
    130     if (L->length == 0) return ERROR;
    131     if (!(i >= 1 && i <= L->length)) return ERROR;
    132 
    133     *e = *(L->elem + i - 1);
    134     if (i != L->length)
    135     {
    136         for (k = i; k <= L->length - 1; k++)
    137         {
    138             *(L->elem + k - 1) = *(L->elem + k);
    139         }
    140     }
    141     L->length--;
    142     return OK;
    143 }
    144 
    145 int ListLength(SqList L)
    146 {
    147     return L.length;
    148 }
    149 
    150 void UnionL(SqList *La, SqList Lb)
    151 {
    152     int La_len, Lb_len, i;
    153     ElemType e;
    154 
    155     La_len = ListLength(*La);
    156     Lb_len = ListLength(Lb);
    157 
    158     for (i = 1; i <= Lb_len; i++)
    159     {
    160         GetElem(Lb, i, &e);
    161         if (!LocateElem(*La, e))
    162             ListInsert(La, ++La_len, e);
    163     }
    164 }
    165 
    166 int main()
    167 {
    168     SqList La, Lb;
    169     int i, j, k;
    170     ElemType e;
    171 
    172     i = InitList(&La);
    173 
    174     for (j = 1; j <= 5; j++)
    175         ListInsert(&La, 1, j);
    176     printf("在L的表头插入1~5后,L->data = ");
    177     ListTraverse(La);
    178     printf("
    ");
    179 
    180     printf("L.length = %d
    ", La.length);
    181     i = ListEmpty(La);
    182     printf("L是否为空:i = %d (1:是 0:否)
    ",i);
    183     printf("
    ");
    184 
    185     i = ClearList(&La);
    186     printf("清空L后,L.length = %d
    ", La.length);
    187     i = ListEmpty(La);
    188     printf("L是否为空:i = %d (1:是 0:否)
    ", i);
    189     printf("
    ");
    190 
    191     for ( j = 0; j <= 10; j++)
    192         ListInsert(&La, j, j);
    193     printf("在L的表头插入1~10后,L->data = ");
    194     ListTraverse(La);
    195     printf("L.length = %d
    ",La.length);
    196     printf("
    ");
    197 
    198     i = ListInsert(&La, 1, 0);
    199     printf("在L的表头插入0后,L.data = ");
    200     ListTraverse(La);
    201     printf("L.length = %d
    ", La.length);
    202     printf("
    ");
    203 
    204     GetElem(La, 5, &e);
    205     printf("第 5 个元素的值为:%d
    ", e);
    206     printf("
    ");
    207 
    208     for ( j = 3; j <= 4; j++)
    209     {
    210         k = LocateElem(La, j); // 查找位序
    211         if (k)
    212             printf("元素%d的位序是%d
    ", j, k);
    213         else
    214             printf("没有值为%d的元素
    ", j);
    215     }
    216     j = 9;
    217     i = ListDelete(&La, j, &e);
    218     if (i == ERROR)
    219         printf("删除第%d个数据失败
    ", j);
    220     else
    221         printf("删除第%d个元素的值为:%d
    ", j, e);
    222     printf("L.length = %d
    ", La.length);
    223     printf("L.data = ");
    224     ListTraverse(La);
    225     printf("
    ");
    226 
    227     k = ListLength(La);
    228     j = k + 1; // 删除第length+1个元素
    229     i = ListDelete(&La, j, &e);
    230     if (i == ERROR)
    231         printf("删除第%d个数据失败
    ", j);
    232     else
    233         printf("删除第%d个元素的值为%d
    ", j, e);
    234     i = InitList(&Lb);
    235     for ( j = 8; j <= 15; j++)
    236         i = ListInsert(&Lb, 1, j);
    237     printf("依次输出Lb的元素:");
    238     ListTraverse(Lb);
    239     printf("
    ");
    240     UnionL(&La, Lb);
    241     printf("L.length = %d
    ", La.length);
    242     printf("依次输出合并之后的L.data = ");
    243     ListTraverse(La);
    244     printf("
    ");
    245 
    246     getchar();
    247     return 0;
    248 }
  • 相关阅读:
    安装centos后无法引导启动windows7的解决方法
    Ubuntu14.04 搜索不到WIFI或连接不上的解决方法。
    ubuntu磁盘分区问题
    Cenos7下nginx+mysql+php环境的搭建
    PHP发送邮件
    php使用数据库的并发问题(乐观锁与悲观锁)
    总结一些php的面试题
    遇到高并发一些处理方法
    PHP中9大缓存技术总结
    php并发加锁示例
  • 原文地址:https://www.cnblogs.com/IamJiangXiaoKun/p/9453249.html
Copyright © 2011-2022 走看看