• 线性表的顺序表示和实现


      1 #include<bits/stdc++.h>//c++万能头文件,写了这个其他头文件不用写 
      2 using namespace std;//使用名字空间,你不用管 
      3 
      4 #define List_Init_Size 100
      5 #define List_Inrement 10
      6 #define pr printf
      7 
      8 struct List{
      9     int *elem;//表的基地址 
     10     int length;//当前表长 
     11     int listsize;//当前表的容量 
     12 };
     13 
     14 //初始化线性表 
     15 bool InitList(List &L)
     16 {
     17     L.elem = (int *)malloc(List_Init_Size*sizeof(int));
     18     if(L.elem == NULL) exit(-1); //如果分配内存失败,就退出程序
     19     
     20     L.length = 0;
     21     L.listsize = 100; 
     22     return 1;
     23 } 
     24 
     25 //线性表插入元素 
     26 bool ListInsert(List &L,int i,int e)
     27 {
     28     if(i < 1 || i > L.length + 1) 
     29     {
     30         puts("Oh! Baby! The insertion position is invalid. Please re-enter the insertion position!");
     31         return 0;
     32     } 
     33     //需要清楚,下标是从0开始,
     34     //该函数实现的是在第i个元素前面插入一个元素,所有必须判断插入位置的合法性 
     35     //除了插在最后的元素后面外其他都需要把后面的元素往后移动
     36     
     37     if(L.length >= L.listsize)
     38     {
     39         //表的容量不够,因为插入的会增加一个元素所以有等号 。
     40         //增加容量
     41         int *newbase = (int *)realloc(L.elem,(List_Init_Size + List_Inrement)*sizeof(int));
     42         //realloc函数用来为ptr重新分配大小为size的一块内存,看似很简单,
     43         //在使用过程中却会发生各种错误。
     44         //函数形式为:
     45         //void * realloc ( void * ptr, size_t new_size ); 
     46         
     47         if(newbase == NULL)
     48         {
     49             //意味着重新分配内存失败
     50             puts("Sorry Baby! Reassigning memory failed!");
     51             exit(-1);//退出程序 
     52         }
     53         L.elem = newbase;
     54         L.listsize += List_Inrement;
     55     } 
     56     
     57     int *q = L.elem + (i-1);//获取第i个元素的地址 
     58     
     59     //第i的后面元素往后移动 
     60     for(int *p = L.elem + (L.length-1); p >= q; p--) 
     61     *(p+1) = *p;
     62     
     63     *q = e;
     64     ++L.length;//添加一个元素,长度加一 
     65     return 1;
     66 }
     67 
     68 //线性表删除元素 
     69 bool List_Delete(List &L,int i,int &e)
     70 {
     71     //先判断位置是否合法
     72     if(i < 1 || i > L.length) 
     73     {
     74         puts("Oh baby! The deletion location is illegal, please re-enter!");
     75         return 0;
     76     }
     77     int *q = L.elem + (L.length - 1);
     78     int *p = L.elem + (i-1); 
     79     e = *p;
     80     ++p;//这里是为了把第I后面的元素往前移动,此时的p为第i+1个元素的位置 
     81     for(p; p <= q; p++)
     82     *(p-1) = *p;
     83     --L.length;//删除一个元素,长度减一
     84     return 1; 
     85 } 
     86 
     87 //获取线性表当前的元素个数
     88 int getListLength(List &L)
     89 {
     90     return L.length;
     91 } 
     92 
     93 //获取线性表元素 
     94 bool getElem(List &L,int q,int &e)
     95 {
     96     if(q < 1 || q > L.length)
     97     {
     98         puts("Oh! Baby! The  position is invalid. Please re-enter the position!");
     99         return 0;
    100     }
    101     int *p = L.elem;
    102     e = *(p + (q - 1)); 
    103     return 1;
    104 }
    105 
    106 //遍历线性表 
    107 void List_Traver(List &L)
    108 {
    109     puts("Let's do it! Traver! Traver_List!"); 
    110     int *p = L.elem;
    111     for(p; p <= L.elem + (L.length - 1); p++)
    112     cout << *p << " ";
    113     puts("");
    114 }
    115  
    116 //获取要查找的第一个满足某个比较关系的元素位置,我就判断大于,小于,等于吧 
    117 int LocateElem(List &L,int e,string s)
    118 {
    119     int *p = L.elem;
    120     int len = L.length;
    121     int now = 1;
    122        if(s == ">")
    123     {
    124            for(p ;p <= L.elem + (len - 1);p++)
    125            {
    126                if(*p > e)
    127                {
    128                    return  now;
    129             }
    130             now++;
    131         }
    132         puts("Oh baby! Sorry, there is no such number!");
    133         return 0;
    134     } 
    135     else if(s == "<")
    136     {
    137         for(p ;p <= L.elem + (len - 1);p++)
    138            {
    139                if(*p < e)
    140                {
    141                    return  now;
    142             }
    143             now++;
    144         }
    145         puts("Oh baby! Sorry, there is no such number!");
    146         return 0;
    147     }
    148     else{
    149         for(p ;p <= L.elem + (len - 1);p++)
    150            {
    151                if(*p == e)
    152                {
    153                    return  now;
    154             }
    155             now++;
    156         }
    157         puts("Oh baby! Sorry, there is no such number!");
    158         return 0;
    159     }
    160 } 
    161 //销毁线性表,清除堆内存。防止内存泄露 
    162 void List_Destroed(List &L)
    163 {
    164     int *p;
    165     //只能从后面销毁 
    166     for(p = L.elem + (L.length - 1); p >= L.elem; p--)
    167     {
    168         free(p); 
    169     }
    170 }
    171 
    172 
    173 int main()
    174 {
    175     List L;
    176     int ok = InitList(L);
    177     if(ok)
    178     {
    179         puts("Oh Yes! Linear table created successfully!");
    180         cout << "base address = " << L.elem << endl;
    181         cout << "L.length =  " << L.length << endl;
    182         cout << "L.listsize = "<< L.listsize << endl;
    183     } 
    184     
    185     for(int i = 1;i <= 10;i++)
    186     {
    187         if(ListInsert(L,i,i))
    188         {
    189             puts("GO");
    190         }
    191         else {
    192             puts("Something Wrong!");
    193             exit(-1);
    194         }
    195     }
    196     
    197     puts("Check the creation of a linear table");
    198     cout << "base address = " << L.elem << endl;
    199     cout << "L.length =  " << L.length << endl;
    200     cout << "L.listsize = "<< L.listsize << endl;
    201     
    202     List_Traver(L);
    203     
    204     int selem;
    205     bool flag = getElem(L,7,selem);
    206     if(flag)
    207     {
    208         cout << "7th number is equal to " << selem << endl;
    209     }
    210     int pos = LocateElem(L,5,"<");
    211     if(pos) {
    212         cout << pos << endl;
    213     }
    214     
    215     pos = LocateElem(L,5,"=");
    216     if(pos) {
    217         cout << pos << endl;
    218     }
    219     
    220     pos = LocateElem(L,5,">");
    221     if(pos) {
    222         cout << pos << endl;
    223     }
    224     
    225     cout << "sizeof(L) = " << sizeof(L) << endl;
    226     List_Destroed(L);//销毁 
    227     cout << "sizeof(L) = " << sizeof(L) << endl;//检查是否销毁成功,如果成功,
    228     //下面的语句就不执行 ,因为销毁之后不可用了。 
    229     List_Traver(L); 
    230     return 0;
    231 }
  • 相关阅读:
    2.2编译模块实现内核数据操控小结
    期末总结20135320赵瀚青LINUX内核分析与设计期末总结
    20135320赵瀚青LINUX期中总结
    20135320赵瀚青LINUX第八周学习笔记
    20135320赵瀚青LINUX第四章读书笔记
    20135320赵瀚青LINUX第七周学习笔记
    20135320赵瀚青《深入理解计算机系统》第七章读书笔记
    让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
    VMware虚拟机,vps忘记密码修改密码
    项彪与许知远谈论的问题---清醒的活着
  • 原文地址:https://www.cnblogs.com/mch5201314/p/11612207.html
Copyright © 2020-2023  润新知