ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-11 11:06:23  阅读:152  来源: 互联网

标签:02 return 线性表 int liner ele num table 数据结构


顺序存储的线性表

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

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

#include<iostream>
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=0∑n​pi​=1对应移动n−i个节点:i=0∑n​pi​×(n−i)i=0∑n​n+11​(n−i)=n+11​i=0∑n​(n−i)=n+11​×2n(n−1)​=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;
 }

标签:02,return,线性表,int,liner,ele,num,table,数据结构
来源: https://blog.csdn.net/JamSlade/article/details/120215800

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有