02笔记 数据结构——线性表—— 基于《数据结构》(C语言版) 第2版 (严蔚敏等)和《数据结构教程》蔡子经,施伯乐

顺序存储的线性表

A 储存
用一组连续的存储单元依次储存线性表的结点
所有结点的数据类型相同的

所以我们直接开辟数组并且用一个int数据记录存入多少个元素即可

#include
using namespace std;


typedef int data;
const int MAXN = 1000;

class liner
{
public:
    data liner_table[MAXN];
    int ele_num = 0;//储存数量
}

B 插入
在n个节点中,把新节点插在第i位(0≤i≤n)
让原来长度是n的线性表变为n+1的线性表,这个时候,需要把在i后面的数据(一共n-i个数据往后移一个单位),若i==n则不用后移

这时候我们分析时间复杂度
新节点插在各个位置上的 概 率 为 p i , 则 ∑ i = 0 n p i = 1 对 应 移 动 n − i 个 节 点 : ∑ i = 0 n p i × ( n − i ) ∑ i = 0 n 1 n + 1 ( n − i ) = 1 n + 1 ∑ i = 0 n ( n − i ) = 1 n + 1 × n ( n − 1 ) 2 = n 2 概率为p_{i},则∑^n_{i=0}p_{i}=1 \\ 对应移动n-i个节点: ∑^n_{i = 0}p_{i}\times (n-i)\\∑^n_{i = 0}\frac{1}{n+1}(n-i) = \frac{1}{n+1}∑^n_{i = 0}(n-i)=\frac{1}{n+1}\times \frac{n(n-1)}{2}=\frac{n}{2} pi,i=0npi=1ni:i=0npi×(ni)i=0nn+11(ni)=n+11i=0n(ni)=n+11×2n(n1)=2n
所以O(n) = n

代码演示

int liner_insert(data ele, int loc)
{
    if(loc < 0 || loc >= MAXN) return 1;//1表示不合法
    if(ele_num == MAXN) return 2;//2表示满

    for(int i = ele_num; i > loc; i--)
    {
        //从后往前的后移元素
        //注意数数从0开始
        liner_table[i] = liner_table[i - 1];
    }
    liner_table[loc] = ele;
    ele_num++;//数量+!
    return 0;//表示已插入
}

int liner_append(data ele)
{
    if(ele_num == MAXN) return 2;
    liner_table[ele_num++] = ele;
    return 0;
}

C 删除
删除部分类似插入,故不再赘述

int liner_delete(int loc)
{
    if(loc < 0 || loc >= ele_num) return 1;
    //这里已经把ele_num == 0这种情况包含进去了
    
    for(int i = loc; i < ele_num; i++)
    {
        liner_table[i] = liner_table[i + 1];
    }
    ele_num--;
    return 0;
}

课后作业

在这里插入图片描述

不难思路应该是先比较下标一致的元素,然后元素大小差异就是A 和B大小差异
接着若元素大小相等,比较A B 容量大小
但我们在比较元素大小的时候,又需要先知道A B哪个元素数量更少,避免越界

int compare(liner& A, liner& B)const
{
    int flag, times;
    if(A.ele_num == B.ele_num) 
    {flag = 0; times = A.ele_num;}
    else if(A.ele_num > B.ele_num) 
    {flag = 1; times = A.ele_num;}
    else 
    {flag = -1; times = B.ele_num;}

    
    for(int i = 0; i < times; i++)
    {
        if(A.liner_table[i] < B.liner_table[i]) return -1;
        else if (A.liner_table[i] > B.liner_table[i]) return 1;
    }

    return flag;
}

在这里插入图片描述
就是个reverse函数

//work 1.2
 void reverse(liner&A)
 {
     int times = A.ele_num / 2;
     for(int i = 0; i < times; i++)
     {
         int temp = A.liner_table[i];
         A.liner_table[i] = A.liner_table[ele_num - 1 - i];
         A.liner_table[ele_num - 1 - i] = temp;
     }
     return;
 }

你可能感兴趣的:(数据结构笔记,数据结构)