zoukankan      html  css  js  c++  java
  • 线性表运算--顺序存储结构实现

    对于线性表我们应掌握如下要点:

    1、  掌握线性表的结构特点:顺序存储和链式存储。

    2、  掌握线性表的基本操作:初始化,插入,删除,查找,判空,求线性表长度等运算在顺序存储结构和链式存储结构上的实现。

    顺序存储具有随机访问的特点,而链式存储具有顺序访问的特点。

    对于不同的应用我们应当选择不同的结构。

    顺序结构实现源代码如下:

     1 HList.h  //线性表头文件定义
     2 //数据结构头文件在定义,
     3 //链表的头文件
     4 #ifndef  _HLIST_H_
     5 #define  _HLIST_H_
     6 //#define  M_error -1 
     7 #include"stdlib.h"
     8 #define Length_Size 100
     9 #define add_Length 10
    10 typedef int Element; 
    11 struct Link
    12 {
    13     Element *p;            //链表表示的物理线形表
    14     Element leg   ;        //线形表的当前长度
    15     Element list_size;     //线形表分配的数据的长度
    16 
    17 };
    18 //定义一个函数指针类型P_ptr  
    19 //用于compare();比较函数的调用
    20 typedef bool (*P_ptr)(Element &a,Element &b);  
    21 
    22 //定义一个函数指针类型P_Vs
    23 typedef bool (*P_Vs)(Element &a,Element &b);
    24 
    25 //初始化一个线形表
    26 //成功返回ture 失败返回false;
    27 bool InitList(Link &L);  
    28 
    29 //销毁一个线形表
    30 //显形表不存在提示错误
    31 //销毁成功返回true,销毁失败返回false;
    32 void DestroyList(Link &L);
    33 
    34 //线形表不存在提示错误
    35 //线形表存在清空
    36 //清空成功返回ture,清空失败返回false;
    37 bool ClearList(Link &L);
    38 
    39 //线形表是否为空
    40 //线形表存在不为空返回ture,线形表存在为空返回false
    41 bool IsLink_Empty(Link &L);
    42 
    43 //线形表存在,返回线形表数据元素的长度
    44 
    45 int Get_Link_Length(Link &L);
    46 
    47 //用e获得线形表中第i个元素
    48 //前提线形表已经存在
    49 //获得成功返回ture;获得非法,提示错误
    50 bool Get_element(Link &L,int i,Element &e);
    51 
    52 //线形表存在,e在线形表中第一个满足compare()
    53 //条件的元素,若不满足,则提示错误,若不存在则提示
    54 int Get_Compare(Link &L,Element &e,P_ptr p);
    55 
    56 //获得前驱
    57 //前提L存在,若cur是线形表中的元素,且cur不是第一元素,则返回
    58 //cur的前面一个元素,若找不到则返回错误,
    59 //若找到用pre_e返回,返回 ture
    60 bool Get_Prior_Elm(Link &L,Element &cur,Element &pre_e);
    61 
    62 //获得后继,
    63 //前提L存在,若 cur是线形表中的元素,且cur不是第一元素,则返回
    64 //cur的后面一个元素,若找不到则返回错误,
    65 //若找到用next_e返回,返回为ture
    66 bool Get_Next_Elm(Link &L,Element &cur,Element &next_e);
    67 
    68 //链表存在,
    69 //在链表的第i个元素前插入一个元素e。
    70 //插入范围从i=1,到从末尾插入
    71 //插入成功返回ture,失败返回错误提示
    72 bool List_Insert(Link &L,int i,Element &e);
    73 
    74 //链表存在,将链表中的第i个指定元素删除,
    75 //删除成功返回ture,删除不合法或者错误返回false;
    76 bool List_Delete(Link &L,int i);
    77 
    78 //线形表存在,依次对线形表的每个元素调用vist();
    79 //vist(),操作失败则返回false,操作成功返回ture;
    80 bool ListTraverse(Link &L,P_Vs visit,Element &e);
    81 
    82 //compare()函数的声明
    83 bool Compare(Element &a,Element &b);
    84 
    85 
    86 //输出打印线性表中的所有值
    87 void Print_Link(Link &L);
    88 
    89 bool visit(Element &a,Element &b);
    90 
    91 #endif   //_HLIST_H_

    HList.cpp

      1 HList.cpp     //线性表实现文件
      2 
      3 //数据结构在定义实现文件
      4 //数据结构头文件在定义,
      5 #include<iostream>
      6 #include"HList.h"
      7 //初始化一个线形表,首选默认调用
      8 //成功返回ture 失败返回false;   1
      9 bool InitList(Link &L)
     10 {
     11     L.p = (Element*)malloc(Length_Size*sizeof(Element)); //分配100个元素的存储空间
     12     if(!L.p)
     13     {
     14         std::cout<<"内存空间分配失败"<<std::endl;
     15         return false;
     16 
     17     }
     18     else
     19     {
     20         L.list_size = Length_Size;  //初始分配量
     21         L.leg = 0;                 //当前线形表内容长度
     22         int i = 0;
     23         for(;i<6;i++)
     24         {
     25             L.p[i] = i+1;
     26             
     27         }
     28         L.leg = 6;
     29         return true;
     30     }
     31     
     32 }
     33 
     34 
     35 //销毁一个线形表  最后自动调用
     36 //销毁成功返回true,销毁失败返回false;    2
     37 void DestroyList(Link &L)
     38 {
     39         L.list_size = 0;
     40         L.leg = 0;
     41         free(L.p);
     42 }
     43 
     44 //线形表存在清空
     45 //清空成功返回ture,清空失败返回false;    3
     46 bool ClearList(Link &L)               
     47 {
     48     if (L.leg>0)
     49     {
     50         L.leg = 0;
     51         return true;
     52 
     53     }
     54     else if(0==L.leg)
     55     {
     56         return true;
     57     }
     58     else
     59     {
     60         return false;
     61     }
     62 }
     63 //线形表是否为空
     64 //线形表存在不为空返回ture,线形表存在为空返回false      4
     65 bool IsLink_Empty(Link &L)      
     66 {
     67     if(0 == L.leg && L.p!=NULL )
     68     {
     69         return true;
     70     }
     71     else 
     72     {
     73         return false;
     74 
     75     }
     76 }
     77 
     78 //线形表存在,返回线形表数据元素的长度   5
     79 int Get_Link_Length(Link &L)    
     80 {
     81     if (L.p!=NULL)
     82     {
     83         return L.leg;
     84     }
     85     else
     86     {
     87         return -2;
     88     }
     89 }
     90 
     91 //用e获得线形表中第i个元素
     92 //获得成功返回ture;获得非法,提示错误          6
     93 bool Get_element(Link &L,int i,Element &e)
     94 {
     95     if(L.p!=NULL &&L.leg!=0 && 0<i &&i<=L.leg)
     96     {
     97         e = L.p[i-1];
     98         return true;
     99     }
    100     else if (L.leg == 0)
    101     {
    102         std::cout<<"线性表为空"<<std::endl;
    103         return false;
    104     }
    105     else if(i<1||i>L.leg)
    106     {
    107         std::cout<<"i值不合法"<<std::endl;
    108         return false;
    109     }
    110     else
    111     {
    112         return false;
    113     }
    114 
    115 }
    116 
    117 //b为比较元素e
    118 //a为线性表元素
    119 bool Compare(Element &a,Element &b)
    120 {
    121     if (a>b)
    122     {
    123         return true;
    124     }
    125     else
    126     {
    127         return false;
    128     }
    129 }
    130 
    131 //线形表存在,e在线形表中第一个满足compare()
    132 //条件的元素,若不满足,则提示错误,若不存在则提示
    133 int Get_Compare(Link &L,Element &e,P_ptr p)
    134 {
    135     int i=0;
    136     if(0 == L.leg)
    137     {
    138         return -1;
    139     }
    140     else
    141     {
    142         for(;i<L.leg;i++)
    143        {
    144            if(p(L.p[i],e))
    145            {
    146                return i+1;
    147            }
    148        }
    149         return -2;
    150     }
    151 }
    152 //获得前驱
    153 bool Get_Prior_Elm(Link &L,Element &cur,Element &pre_e)
    154 {
    155     int i = 1;
    156     if(0 ==L.leg)
    157     {
    158         std::cout<<"线性表为空,无法完成操作"<<std::endl;
    159         return false;
    160     }
    161     else if (L.p[0] == cur)
    162     {
    163         std::cout<<"cur为线性表中第一个元素,没有前驱"<<std::endl;
    164         return false;
    165     }
    166     else
    167     {
    168         for(;i<=L.leg;i++)
    169         {
    170             if(L.p[i]==cur)
    171             {
    172                 pre_e = L.p[i-1];
    173                 return true;
    174             }
    175             
    176         }
    177         std::cout<<"输入元素不存在"<<std::endl;
    178         return false;
    179     }
    180 
    181 }
    182 
    183 //获得后继,
    184 bool Get_Next_Elm(Link &L,Element &cur,Element &next_e)
    185 {
    186     int i = 0;
    187     if(0 ==L.leg)
    188     {
    189         std::cout<<"线性表为空,无法完成操作"<<std::endl;
    190         return false;
    191     }
    192     else if (L.p[L.leg-1] == cur)
    193     {
    194         std::cout<<"cur为线性表中最后一个元素,没有后继"<<std::endl;
    195         return false;
    196     }
    197     else
    198     {
    199         for(;i<L.leg-1;i++)
    200         {
    201             if(L.p[i]==cur)
    202             {
    203                 next_e = L.p[i+1];
    204                 return true;
    205             }
    206         }
    207     std::cout<<"输入元素不存在"<<std::endl;
    208     return false;
    209     }
    210 }
    211 
    212 
    213 
    214 bool List_Insert(Link &L,int i,Element &e)
    215 {
    216     int j=L.leg;
    217     Element* new_p;
    218     if(i<1&&i>L.leg+1)
    219     {
    220         std::cout<<"i值不合法"<<std::endl;
    221         return false;
    222 
    223     }
    224     if(L.leg ==L.list_size)//内存不足,分配空间
    225     {
    226         new_p = (Element*)realloc(L.p,(L.list_size+add_Length)*sizeof(Element));
    227         if(!new_p)
    228         {
    229             std::cout<<"内存扩展失败"<<std::endl;
    230             return false;
    231         }
    232         L.p = new_p;
    233     }
    234     for(;j>=i;j--)
    235     {
    236         L.p[j]=L.p[j-1];
    237     }
    238 
    239     L.p[i-1] = e;
    240     L.leg++;
    241 
    242     return true; 
    243 }
    244 
    245 
    246 bool List_Delete(Link &L,int i)
    247 {
    248     if(0==L.leg)
    249     {
    250         std::cout<<"线性表为空,无法执行删除操作"<<std::endl;
    251         return false;
    252     }
    253     else
    254     {
    255         int j = i;
    256         if(1<=i&&i<=L.leg)
    257         {
    258             while(j<L.leg)
    259             {
    260                 L.p[j-1] = L.p[j];
    261                 j++;
    262             }
    263             L.leg--;
    264             return true;
    265         }
    266         else if (i<1||i>L.leg)
    267         {
    268             std::cout<<"i值输入不合法"<<std::endl;
    269             return false;
    270         }
    271         else
    272         {
    273             return false;
    274         }
    275     }
    276 }
    277 
    278 bool visit(Element &a,Element &b)
    279 {
    280     if(a<=b)
    281     {
    282         return false;
    283     }
    284     else
    285     {
    286         return true;
    287     }
    288 }
    289 //测试,;依次对元素调用visit函数
    290 //有一个不满足则返回false
    291 bool ListTraverse(Link &L,P_Vs visit,Element &e)
    292 {
    293     if(0==L.leg)
    294     {
    295         std::cout<<"线性表为空"<<std::endl;
    296         return false;
    297     }
    298     else
    299     {
    300         while(L.leg>=1)
    301         {
    302             if(!visit(L.p[L.leg-1],e))
    303             {
    304                 return false;
    305             }
    306             L.leg--;
    307         }
    308     }
    309     return true;
    310 
    311 }
    312 
    313 
    314 void Print_Link(Link &L)
    315 {
    316     int i = 1;
    317     for(;i<=L.leg;i++)
    318     {
    319         std::cout<<L.p[i-1]<<" ";
    320     }
    321 }
    书到用时方恨少,是非经过不知难。 博观而约取,厚积而薄发。@karllen 每天进步一点点。
  • 相关阅读:
    人脸识别总结(附开源项目代码与各大数据集下载路径)
    simpledet 的配置
    论文笔记--PCN:Real-Time Rotation-Invariant Face Detection with Progressive Calibration Networks
    smallcorgi/Faster-RCNN_TF训练自己的数据
    保存文件名至txt文件中,不含后缀
    训练 smallcorgi/Faster-RCNN_TF 模型(附ImageNet model百度云下载地址)
    调试 smallcorgi/Faster-RCNN_TF 的demo过程遇到的问题
    python字符串前缀和格式化
    摩斯电码与字母相互转换
    django配置mysql
  • 原文地址:https://www.cnblogs.com/Forever-Kenlen-Ja/p/3734349.html
Copyright © 2011-2022 走看看