• 数据结构一——顺序表


    顺序表基本运算的实现

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<algorithm>
      4 #define MaxSize 50
      5 using namespace std;
      6 
      7 typedef int ElemType;
      8 
      9 typedef struct
     10 {
     11     ElemType data[MaxSize];        //线性表中的元素
     12     int length;                    //线性表长度
     13 }SqList;
     14 
     15 //初始化线性表
     16 //只需分配线性表的存储空间,并将length设为0
     17 void InitList(SqList * &L)
     18 {
     19     L = (SqList *)malloc(sizeof(SqList));
     20     L->length = 0;
     21 }
     22 
     23 //由a中的n个元素建立顺序表
     24 void CreatList(SqList * &L, ElemType a[], int n)
     25 {
     26     int k = 0;
     27     L = (SqList *)malloc(sizeof(SqList));
     28     for (int i = 0; i < n; i++)
     29         L->data[i] = a[i];
     30     L->length = n;
     31 }
     32 
     33 //销毁线性表
     34 //就是释放线性表L占用的空间
     35 void DestroyList(SqList * &L)
     36 {
     37     free(L);
     38 }
     39 
     40 //判断线性表是否为空
     41 bool ListEmpty(SqList * L)
     42 {
     43     return L->length == 0;
     44 }
     45 
     46 //求线性表的长度
     47 //顺序表是O(1)
     48 int ListLength(SqList * L)
     49 {
     50     return L->length;
     51 }
     52 
     53 //输出线性表
     54 void DispList(SqList * L)
     55 {
     56     for (int i = 0; i < L->length; i++)
     57         printf("%d ", L->data[i]);
     58     printf("
    ");
     59 }
     60 
     61 //求线性表中第i个元素值e
     62 bool GetElem(SqList * L, int i, ElemType &e)
     63 {
     64     if (i < 1 || i > L->length)  return false;            //参数i错误时放回false
     65     e = L->data[i];
     66     return true;
     67 }
     68 
     69 //按元素值查找
     70 //在顺序表中查找第一个值与e相等的元素的逻辑序号
     71 int LocateElem(SqList * L, ElemType e)
     72 {
     73     bool pos = 0;            //默认为0,表示没找到
     74     for (int i = 0; i < L->length; i++)
     75         if (L->data[i] == e)
     76         {
     77             pos = i + 1;
     78             break;
     79         }
     80     return pos;
     81 }
     82 
     83 //插入元素
     84 //在顺序表的第i个位置上插上新元素e
     85 bool ListInsert(SqList * &L, int i, ElemType e)
     86 {
     87     if (i < 1 || i > L->length + 1)  return false;    
     88     i--;
     89     for (int j = L->length; j > i; j--)  L->data[j] = L->data[j - 1];  //将data[i]及以后的元素后移一位
     90     L->data[i] = e;
     91     L->length++;
     92     return true;
     93 }
     94 
     95 //删除元素
     96 bool ListDelete(SqList * &L, int i, ElemType &e)
     97 {
     98     if (i < 1 || i > L->length) return false;
     99     i--;
    100     e = L->data[i];
    101     for (int j = i; j < L->length; j++) L->data[j] = L->data[j + 1];
    102     L->length--;
    103     return true;
    104 }
    105 
    106 //一些应用
    107 //1、删除顺序表中所有值等于x的元素,要求时间复杂度为O(n)、空间复杂度为O(1)
    108 void Delnode1(SqList * &L, ElemType x)
    109 {
    110     int cnt = 0;    //记录不等于x的元素的个数,即要插入到L中的元素的个数
    111     for(int i = 0;i < L->length;i++)
    112         if (L->data[i] != x)
    113             L->data[cnt++] = L->data[i];
    114     L->length = cnt;
    115 }
    116 void Delnode2(SqList * &L, ElemType x)
    117 {
    118     int cnt = 0;    //记录等于x的元素的个数
    119     for (int i = 0; i < L->length; i++)
    120     {
    121         if (L->data[i] == x)  cnt++;
    122         else  L->data[i - cnt] = L->data[i];
    123     }
    124     L->length -= cnt;
    125 }
    126 
    127 //2、尽可能设计一个高效的算法,使得以第一个元素为分界线,将所有小于等于它的元素移到该基准前面,大于它的元素移到该基准的后面
    128 //以下两个都是时间复杂度为O(n)、空间复杂度为O(1)
    129 void partition1(SqList * &L)
    130 {
    131     int i = 0, j = L->length - 1;
    132     ElemType pivot = L->data[0];
    133     while (i < j)
    134     {
    135         while (i < j && L->data[j] > pivot)  j--;    //先要得到j,可考虑3、1、7、5、4
    136         while (i < j && L->data[i] <= pivot) i++;    //从左到右扫描,找到一个大于pivot的元素
    137         if (i < j)  swap(L->data[i], L->data[j]);
    138     }
    139     swap(L->data[0], L->data[i]);            //最后将基准移到中间
    140 }
    141 void partition2(SqList * &L)
    142 {
    143     int i = 0, j = L->length - 1;
    144     ElemType pivot = L->data[0];
    145     while (i < j)
    146     {
    147         while (i < j && L->data[j] > pivot)  j--;
    148         L->data[i] = L->data[j];            //利用第一位的空位
    149         while (i < j && L->data[i] <= pivot)  i++;
    150         L->data[j] = L->data[i];
    151     }
    152     L->data[i] = pivot;
    153 }
    154 
    155 //3、设计一个尽可能高效的算法,将所有奇数移动到偶数的前面
    156 //以下两个都是时间复杂度为O(n)、空间复杂度为O(1)
    157 void move1(SqList * &L)
    158 {
    159     int i = 0, j = L->length - 1;
    160     while (i < j)
    161     {
    162         while (i < j && L->data[j] % 2 == 0)  j--;        //从右向左扫描,找到一个奇数
    163         while (i < j && L->data[i] % 2 == 1)  i++;        //从左向右扫描,找到一个偶数
    164         if (i < j)  swap(L->data[i], L->data[j]);
    165     }
    166 }
    167 void move2(SqList * &L)
    168 {
    169     int cnt = -1;        //当前奇数的个数
    170     for(int i = 0;i <= L->length;i++)    
    171         if (L->data[i] % 2 == 1)            //i指向奇数时
    172         {
    173             cnt++;
    174             if (cnt != i)  swap(L->data[cnt], L->data[i]);
    175         }
    176 }

     参考资料:数据结构教程  李春葆版

  • 相关阅读:
    mybatis使用*号查询数据丢失问题
    设计四个线程,其中两个线程每次对j增加1,另外两个线程对j每次减1,写出程序
    用代码实现以下程序:篮子中有10个玩具,每60秒取出3个,同时每40秒向篮子中放入1个,不断重复上述动作,当篮子中剩余玩具不足3个是,程序结束
    伽马分布的性质
    三角函数公式
    微分和积分的中值定理
    一些需要理解掌握的知识点
    一阶微分不变性
    泰勒展开和麦克劳林级数
    重要极限(1+1/n)的n次方
  • 原文地址:https://www.cnblogs.com/lfri/p/9943512.html
Copyright © 2020-2023  润新知