zoukankan      html  css  js  c++  java
  • 2.2线性表的顺序存储和基本运算的实现

    数组

    增加O(n)

    删除O(n)

    线性查找O(n)二分查找O(log2(n))

    修改O(1)

    插入O(n)

    数据结构:

    1 狭义:

    数据结构是专门研究数据存储的问题

    数据的存储包含两方面:个体的存储+个体关系的存储

    2 广义:

    数据结构既包含数据的存储也包含数据的操作

    对存储数据的操作就是算法

    算法:

    1 狭义的算法与数据的存储方式密切相关。

    2 广义的算法与数据的存储方式无关。

    泛型:

    利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的。

    数据的存储结构有几种

    1 线性

    1.1 连续存储【数组】

    优点

    存取速度很快

    缺点

    事先必须知道数组的长度

    插入、删除元素很慢

    空间通常是有限制

    需要大块连续的内存块

    1.2 离散存储【链表】

    优点

    空间没有限制

    插入、删除元素很快

    缺点

    存取速度很慢

    线性结构的应用-栈和队列

    2 非线性

    1 静态数组

    2 动态数组

    1 静态数组

      1 #define _CRT_SECURE_NO_WARNINGS
      2 
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 
      6 //作为静态数组,无法变长,一旦分配内存,就固定了,不可以增加
      7 //外部的内存可以访问,但是外部内存可能被使用,也可能没有被使用
      8 //没有使用的情况下,越界偶尔会成功,还是可能被再次回收利用
      9 //已经使用,必然失败
     10 //a[n]等价于*(a+n);从数组名首地址开始,往下寻址,取出内容,数组不会检测越界
     11 //偶尔会成功,偶然的成功比必然的失败更加可怕,数组不可以越界
     12 
     13 main1()
     14 {
     15     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
     16 
     17     printf("%x
    ", a);
     18 
     19     system("pause");
     20 }
     21 
     22 //静态数组,不可以处理较大的数据
     23 
     24 main2()
     25 {
     26     int b[1024 * 014 * 10];//默认数组在栈上,最大只能使用1MB
     27 
     28     printf("%x
    ", b);
     29 
     30     system("pause");
     31 }
     32 
     33 main3()
     34 {
     35     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
     36     int i, j;
     37     int length = sizeof(a) / sizeof(int);
     38 
     39     for (i = 0;i < length;i++)
     40     {
     41         printf("%d
    ", a[i]);
     42     }
     43 
     44     int num = 8;//要删除的元素
     45 
     46     if (num == a[9])//检测最后一个元素
     47     {
     48         length = length - 1;//删除一个元素,元素在末尾
     49     }
     50     else
     51     {
     52         for (i = 0;i < length - 1;i++)//检测最后一个之前
     53         {
     54             if (a[i] == num)
     55             {
     56                 for (j = i;j < length - 1;j++)//从删除的位置开始,到最后一个全部向前移动
     57                 {
     58                     a[j] = a[j + 1];//逐个向前移动赋值
     59                 }
     60                 length = length - 1;
     61                 break;
     62             }
     63         }
     64     }
     65 
     66     printf("尾部删除以后
    ");
     67     for (i = 0;i < length;i++)
     68     {
     69         printf("%d
    ", a[i]);
     70     }
     71 
     72     system("pause");
     73 
     74 }
     75 
     76 //查询方便
     77 main4()
     78 {
     79     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
     80     int i;
     81     int flag = 0;
     82     int length = sizeof(a) / sizeof(int);
     83 
     84     for (i = 0;i < length;i++)//逐个访问数组每个元素
     85     {
     86         if (a[i] == 7)//查询
     87         {
     88             flag = 1;
     89             break;
     90         }
     91     }
     92 
     93     if (flag == 1)
     94     {
     95         printf("找到");
     96     }
     97 
     98     system("pause");
     99 }
    100 
    101 //修改方便
    102 main()
    103 {
    104     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
    105     int i;
    106     int flag = 0;
    107     int length = sizeof(a) / sizeof(int);
    108 
    109     for (i = 0;i < length;i++)//逐个访问数组每个元素
    110     {
    111         if (a[i] == 7)//查询
    112         {
    113             flag = 1;
    114             a[i] = 9;
    115             break;
    116         }
    117     }
    118 
    119     for (i = 0;i < length;i++)
    120     {
    121         printf("%d
    ", a[i]);
    122     }
    123 
    124     system("pause");
    125 }

    2 动态数组

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <stdbool.h>
      4 
      5 struct Arr
      6 {
      7     int *pBase;//存储的是数组第一个元素的地址
      8     int len;//数组所能容纳的最大元素的个数
      9     int cnt;//当前数组有效元素的个数
     10 };
     11 
     12 typedef struct Arr ARR;
     13 
     14 void init_arr(ARR *pArr, int length);//初始化
     15 bool append_arr(ARR *pArr, int val);//追加
     16 bool insert_arr(ARR *pArr, int pos, int val);//插入,pos值从1开始
     17 bool delete_arr(ARR *pArr, int pos, int * pVal);//删除元素
     18 int get();//暂无实现
     19 bool is_empty(ARR *pArr);//判断是否为空
     20 bool is_full(ARR *pArr);//判断是否已满
     21 void sort_arr(ARR *pArr);//排序
     22 void show_arr(ARR *pArr);//打印
     23 void inversion_arr(ARR *pArr);//逆序
     24 
     25 void main()
     26 {
     27     struct Arr arr;
     28     int val = 0;//保存删除以后的元素
     29     
     30     init_arr(&arr, 6);//初始化
     31     
     32     show_arr(&arr);//打印
     33 
     34     append_arr(&arr, 1);//追加
     35     append_arr(&arr, 2);
     36     append_arr(&arr, 3);
     37     append_arr(&arr, 4);
     38     append_arr(&arr, 5);
     39 
     40     insert_arr(&arr, 6, 99);//插入,pos值从1开始
     41 
     42     show_arr(&arr);//打印
     43 
     44     if (delete_arr(&arr, 1, &val))//删除元素
     45     {
     46         printf("删除成功
    ");
     47         printf("你所删除的元素是%d
    ", val);
     48     }
     49     else
     50     {
     51         printf("删除失败
    ");
     52     }
     53     
     54     show_arr(&arr);//打印
     55 
     56     inversion_arr(&arr);//逆序
     57     show_arr(&arr);//打印
     58 
     59     sort_arr(&arr);//排序
     60     show_arr(&arr);//打印
     61 
     62     system("pause");
     63 }
     64 
     65 void init_arr(ARR *pArr, int length)//初始化
     66 {
     67     pArr->pBase = (int *)malloc(sizeof(int) * length);
     68     if (pArr->pBase == NULL)
     69     {
     70         printf("内存分配失败
    ");
     71     }
     72     else
     73     {
     74         pArr->len = length;
     75         pArr->cnt = 0;
     76     }
     77 }
     78 
     79 bool append_arr(ARR * pArr, int val)//追加
     80 {
     81     if (is_full(pArr))//满了
     82     {
     83         return false;
     84     }
     85     else
     86     {
     87         pArr->pBase[pArr->cnt] = val;
     88         (pArr->cnt)++;
     89         return true;
     90     }
     91 }
     92 
     93 bool insert_arr(ARR * pArr, int pos, int val)//插入,pos值从1开始
     94 {
     95     int i;
     96     if (is_full(pArr))//满了
     97     {
     98         return false;
     99     }
    100     if (pos<1 || pos>pArr->cnt + 1)
    101     {
    102         return false;
    103     }
    104     for (i = pArr->cnt - 1; i >= pos - 1; i--)
    105     {
    106         pArr->pBase[i + 1] = pArr->pBase[i];
    107     }
    108     pArr->pBase[pos - 1] = val;
    109     pArr->cnt++;
    110     return true;
    111 }
    112 
    113 bool delete_arr(ARR * pArr, int pos, int * pVal)//删除元素
    114 {
    115     int i = 0;
    116     if (is_empty(pArr))//空了
    117     {
    118         return false;
    119     }
    120     if (pos<1 || pos>pArr->cnt)
    121     {
    122         return false;
    123     }
    124 
    125     *pVal = pArr->pBase[pos - 1];//保存将要删除的元素
    126 
    127     for (i = pos; i < pArr->cnt; i++)
    128     {
    129         pArr->pBase[i - 1] = pArr->pBase[i];
    130     }
    131     pArr->cnt--;
    132     return true;
    133 }
    134 
    135 bool is_empty(ARR * pArr)//判断是否为空
    136 {
    137     if (pArr->cnt == 0)
    138     {
    139         return true;
    140     }
    141     else
    142     {
    143         return false;
    144     }
    145 }
    146 
    147 bool is_full(ARR * pArr)//判断是否已满
    148 {
    149     if (pArr->len == pArr->cnt)
    150     {
    151         return true;
    152     }
    153     else
    154     {
    155         return false;
    156     }
    157 }
    158 
    159 void sort_arr(ARR * pArr)//排序
    160 {
    161     int i = 0, j = 0;
    162     int t = 0;
    163 
    164     for (i = 0; i < pArr->cnt - 1; i++)//冒泡
    165     {
    166         for (j = 0; j < pArr->cnt - 1 - i; j++)
    167         {
    168             if (pArr->pBase[j]>pArr->pBase[j + 1])
    169             {
    170                 t = pArr->pBase[j];
    171                 pArr->pBase[j] = pArr->pBase[j + 1];
    172                 pArr->pBase[j + 1] = t;
    173             }
    174         }
    175     }
    176 }
    177 
    178 void show_arr(ARR *pArr)//打印
    179 {
    180     if (is_empty(pArr))
    181     {
    182         printf("数组为空
    ");
    183     }
    184     else
    185     {
    186         int i = 0;
    187         for (i = 0; i < pArr->cnt; i++)
    188         {
    189             printf("%d ", pArr->pBase[i]);
    190         }
    191         printf("
    ");
    192     }
    193 }
    194 
    195 void inversion_arr(ARR *pArr)//逆序
    196 {
    197     int i = 0;
    198     int j = pArr->cnt - 1;
    199     int t = 0;
    200     while (i < j)
    201     {
    202         t = pArr->pBase[i];
    203         pArr->pBase[i] = pArr->pBase[j];
    204         pArr->pBase[j] = t;
    205         i++;
    206         j--;
    207     }
    208 }

    C++实现vector

      1 #include "myvector.h"
      2 
      3 template <class T>
      4 myvector<T>::myvector()
      5 {
      6     p = nullptr;
      7     n = realn = 0;
      8 }
      9 
     10 template <class T>
     11 myvector<T>::~myvector()
     12 {
     13     if (p != nullptr)
     14     {
     15         delete[]p;
     16         p = nullptr;
     17     }
     18 }
     19 
     20 template <class T>
     21 void myvector<T>::push_pack(T t)//最后面插入
     22 {
     23     if (p == nullptr)//如果原来为空表
     24     {
     25         p = new T;
     26         *p = t;
     27         realn = n = 1;
     28     }
     29     else
     30     {
     31         T *ptemp = new T[n + 1];
     32         for (int i = 0; i < n; i++)
     33         {
     34             *(ptemp + i) = *(p + i);
     35         }
     36         *(ptemp + n) = t;
     37         delete[]p;
     38         p = ptemp;
     39 
     40         n += 1;
     41         realn += 1;
     42     }
     43 }
     44 
     45 template <class T>
     46 T *myvector<T>::find(T t)//查找
     47 {
     48     for (int i = 0; i < realn; i++)
     49     {
     50         if (t == p[i])
     51         {
     52             return p + i;
     53         }
     54     };
     55     return nullptr;
     56 }
     57 
     58 template <class T>
     59 void myvector<T>::change(T *pos, T t)//修改
     60 {
     61     if (pos == nullptr)
     62     {
     63         return;
     64     }
     65     else
     66     {
     67         *pos = t;
     68     }
     69 }
     70 
     71 template <class T>
     72 void myvector<T>::del(T t)//删除
     73 {
     74     int pos = -1;
     75     for (int i = 0; i < realn; i++)
     76     {
     77         if (t == *(p + i))
     78         {
     79             pos = i;
     80             break;
     81         }
     82     }
     83     if (pos != -1)
     84     {
     85         if (pos == realn - 1)
     86         {
     87             realn -= 1;
     88         }
     89         else
     90         {
     91             for (int i = pos; i < realn - 1; i++)
     92             {
     93                 p[i] = p[i + 1];
     94             }
     95             realn -= 1;
     96         }
     97     }
     98 }
     99 
    100 template <class T>
    101 void myvector<T>::insert(T findt, T t)//在某个元素前插入,前插
    102 {
    103     if (n == realn)//如果标记内存长度==实际长度
    104     {
    105         int pos = -1;
    106         for (int i = 0; i < realn; i++)
    107         {
    108             if (findt == *(p + i))
    109             {
    110                 pos = i;
    111                 break;
    112             }
    113         }
    114         if (pos != -1)//如果查找的元素存在
    115         {
    116             T *ptemp = new T[n + 1];
    117             for (int i = 0; i < n; i++)
    118             {
    119                 *(ptemp + i) = *(p + i);
    120             }
    121             *(ptemp + n) = t;
    122             delete[]p;
    123             p = ptemp;
    124 
    125             n += 1;
    126             realn += 1;
    127         }
    128 
    129         for (int i = realn - 2; i >= pos; i--)
    130         {
    131             p[i + 1] = p[i];
    132         }
    133         p[pos] = t;
    134     }
    135     else
    136     {
    137         int pos = -1;
    138         for (int i = 0; i < realn; i++)
    139         {
    140             if (findt == *(p + i))
    141             {
    142                 pos = i;
    143                 break;
    144             }
    145         }
    146 
    147         if (pos != -1)
    148         {
    149             for (int i = realn - 2; i >= pos; i--)
    150             {
    151                 p[i + 1] = p[i];
    152             }
    153             p[pos] = t;
    154 
    155             realn += 1;
    156         }
    157     }
    158 }
    159 
    160 template <class T>
    161 void myvector<T>::show()//打印
    162 {
    163     if (p == nullptr)
    164     {
    165         return;
    166     }
    167     else
    168     {
    169         for (int i = 0; i < realn; i++)
    170         {
    171             std::cout << p[i] << " ";
    172         }
    173         std::cout << "
    ";
    174     }
    175 }
  • 相关阅读:
    Android安全研究经验谈
    论文相关笔记5
    论文相关笔记4
    论文相关笔记3
    论文相关笔记2
    论文相关笔记1
    朝鲜RedStar_OS_3.0安装图解
    Careerup上的简历模板
    冒泡、二分排序
    火狐插件
  • 原文地址:https://www.cnblogs.com/denggelin/p/5683274.html
Copyright © 2011-2022 走看看