• 线性表的顺序表示


    线性表了有如下几个特征:

    1.集合中必存在唯一的一个"第一个元素";

    2.集合中必存在唯一的一个"最后的元素";

    3.除最后元素之外,其它数据元素均有唯一的"后继";

    4.除第一元素之外,其它数据元素均有唯一的"前驱"。

    线性表的顺序表示指的是用物理上的一段连续的地址来存储数据元素。

    如果第一个元素的在内存上的地址为a1,每个元素占用的空间是l,那么第n个元素的地址就是a1+(n-1) x l。

    数组描述的线性表顺序结构表示:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 #define TRUE 1
      5 #define FALSE 0
      6 #define OK 1
      7 #define ERROR 0
      8 #define INIT_SIZE 10        //初始化表长
      9 #define INCREMENT_SIZE 5    //分配增量
     10 
     11 typedef int Status;
     12 typedef int Elemtype;
     13 
     14 /*
     15  * 存储结构
     16  */
     17 typedef struct
     18 {
     19     Elemtype *elem;    //存储空间基址
     20     int length;        //当前长度
     21     int size;        //当前分配的表长大小
     22 }SqList;
     23 
     24 /*
     25  * 初始化一个空的线性表
     26  */
     27 Status InitList(SqList *L)
     28 {
     29     L->elem = (Elemtype *) malloc(INIT_SIZE * sizeof(Elemtype));
     30     if (!L->elem)
     31     {
     32         return ERROR;
     33     }
     34     L->length = 0;
     35     L->size = INIT_SIZE;
     36     return OK;
     37 }
     38 
     39 /*
     40  * 销毁线性表
     41  */
     42 Status DestroyList(SqList *L)
     43 {
     44     free(L->elem);
     45     L->length = 0;
     46     L->size = 0;
     47     return OK;
     48 }
     49 
     50 /*
     51  * 清空线性表
     52  */
     53 Status ClearList(SqList *L)
     54 {
     55     L->length = 0;
     56     return OK;
     57 }
     58 
     59 /*
     60  * 判断线性表是否为空
     61  */
     62 Status isEmpty(const SqList L)
     63 {
     64     if (0 == L.length)
     65     {
     66         return TRUE;
     67     }
     68     else
     69     {
     70         return FALSE;
     71     }
     72 }
     73 
     74 /*
     75  * 获取长度
     76  */
     77 Status getLength(const SqList L)
     78 {
     79     return L.length;
     80 }
     81 
     82 /*
     83  * 根据位置获取元素
     84  */
     85 Status GetElem(const SqList L, int i, Elemtype *e)
     86 {
     87     if (i < 1 || i > L.length)
     88     {
     89         return ERROR;
     90     }
     91     *e = L.elem[i-1];
     92     return OK;
     93 }
     94 
     95 /*
     96  * 比较两个元素是否相等
     97  */
     98 Status compare(Elemtype e1, Elemtype e2)
     99 {
    100     if (e1 == e2)
    101     {
    102         return 0;
    103     }
    104     else if (e1 < e2)
    105     {
    106         return -1;
    107     }
    108     else
    109     {
    110         return 1;
    111     }
    112 }
    113 
    114 /*
    115  * 查找元素
    116  */
    117 Status FindElem(const SqList L, Elemtype e, Status (*compare)(Elemtype, Elemtype))
    118 {
    119     int i;
    120     for (i = 0; i < L.length; i++)
    121     {
    122         if (!(*compare)(L.elem[i], e))
    123         {
    124             return i + 1;
    125         }
    126     }
    127     if (i >= L.length)
    128     {
    129         return ERROR;
    130     }
    131 }
    132 
    133 /*
    134  * 查找前驱元素
    135  */
    136 Status PreElem(const SqList L, Elemtype cur_e, Elemtype *pre_e)
    137 {
    138     int i;
    139     for (i = 0; i < L.length; i++)
    140     {
    141         if (cur_e == L.elem[i])
    142         {
    143             if (i != 0)
    144             {
    145                 *pre_e = L.elem[i - 1];
    146             }
    147             else
    148             {
    149                 return ERROR;
    150             }
    151         }
    152     }
    153     if (i >= L.length)
    154     {
    155         return ERROR;
    156     }
    157 }
    158 
    159 /*
    160  * 查找后继元素
    161  */
    162 Status NextElem(const SqList L, Elemtype cur_e, Elemtype *next_e)
    163 {
    164     int i;
    165     for (i = 0; i < L.length; i++)
    166     {
    167         if (cur_e == L.elem[i])
    168         {
    169             if (i < L.length - 1)
    170             {
    171                 *next_e = L.elem[i + 1];
    172                 return OK;
    173             }
    174             else
    175             {
    176                 return ERROR;
    177             }
    178         }
    179     }
    180     if (i >= L.length)
    181     {
    182         return ERROR;
    183     }
    184 }
    185 
    186 /*
    187  * 插入元素
    188  */
    189 Status InsertElem(SqList *L, int i, Elemtype e)
    190 {
    191     Elemtype *new_ele;
    192     if (i < 1 || i > L->length + 1)
    193     {
    194         return ERROR;
    195     }
    196     if (L->length >= L->size)
    197     {
    198         new_ele = (Elemtype*) realloc(L->elem, (L->size + INCREMENT_SIZE) * sizeof(Elemtype));
    199         if (!new_ele)
    200         {
    201             return ERROR;
    202         }
    203         L->elem = new_ele;
    204         L->size += INCREMENT_SIZE;
    205     }
    206     Elemtype *p = &L->elem[i - 1];
    207     Elemtype *q = &L->elem[L->length - 1];
    208     for (; q >= p; q--)
    209     {
    210         *(q + 1) = *q;
    211     }
    212     *p = e;
    213     ++L->length;
    214     return OK;
    215 }
    216 
    217 /*
    218  * 删除元素并返回其值
    219  */
    220 Status DeleteElem(SqList *L, int i, Elemtype *e)
    221 {
    222     if (i < 1 || i > L->length)
    223     {
    224         return ERROR;
    225     }
    226     Elemtype *p = &L->elem[i - 1];
    227     *e = *p;
    228     for (; p < &L->elem[L->length]; p++)
    229     {
    230         *(p) = *(p + 1);
    231     }
    232     --L->length;
    233     return OK;
    234 }
    235 
    236 /*
    237  * 访问元素
    238  */
    239 void visit(Elemtype e)
    240 {
    241     printf("%d ", e);
    242 }
    243 
    244 /*
    245  * 遍历线性表
    246  */
    247 Status TraverseList(const SqList L, void (*visit)(Elemtype))
    248 {
    249     int i;
    250     for(i = 0; i < L.length; i++)
    251     {
    252         visit(L.elem[i]);
    253     }
    254     return OK;
    255 }
    256 
    257 /*
    258  * 主函数测试
    259  */
    260 int main()
    261 {
    262     SqList L;
    263     if (InitList(&L))
    264     {
    265         Elemtype e;
    266         printf("init_success
    ");
    267         int i;
    268         for (i = 0; i < 10; i++)
    269         {
    270             InsertElem(&L, i + 1, i);
    271         }
    272         printf("length is %d
    ", getLength(L));
    273         if (GetElem(L, 1, &e)) {
    274             printf("The first element is %d
    ", e);
    275         }
    276         else
    277         {
    278             printf("element is not exist
    ");        
    279         }
    280         if (isEmpty(L))
    281         {
    282             printf("list is empty
    ");
    283         }
    284         else
    285         {
    286             printf("list is not empty
    ");
    287         }
    288         printf("The 5 at %d
    ", FindElem(L, 5, *compare));
    289         PreElem(L, 6, &e);
    290         printf("The 6's previous element is %d
    ", e);
    291         NextElem(L, 6, &e);
    292         printf("The 6's next element is %d
    ", e);
    293         DeleteElem(&L, 1, &e);
    294         printf("delete first element is %d
    ", e);
    295         printf("list:");
    296         TraverseList(L,visit);
    297         if (DestroyList(&L))
    298         {
    299             printf("
    destroy_success
    ");
    300         }
    301     }
    302 }
  • 相关阅读:
    谈谈C++新标准带来的属性(Attribute)
    金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享
    核桃编程:前端可观测性建设之路
    AI和大数据结合,智能运维平台助力流利说提升核心竞争力
    Python静态类型解析工具简介和实践
    盛京剑客系列24:极简估值教程——题记
    Echarts——关系图(人民的名义为例,简化)源码
    UVA10020(最小区间覆盖)
    LA4636积木艺术
    LA4636积木艺术
  • 原文地址:https://www.cnblogs.com/niceforbear/p/4525268.html
Copyright © 2020-2023  润新知