数据结构考试速刷#

整理知识点以及配套视频,以及LeetCode刷题。 复习重点

单元 1 绪论#

单元 2 线性表#

线性表的插入#

#include <stdio.h>
#define MAX 100

int main()
{
    int a[MAX];
    // b 存放待插入的数据、i存放插入的位置、n存放操作线性表的长度
    int i, j, b, n;
    scanf("%d%d%d", &b, &i, &n);
    for (j = 1; j <= n; j++)
    {
        scanf("%d", &a[j]);
    }
    a[0] = n;
    for (j = n; j >= i; j--)
    {
        a[j + 1] = a[j];
    }
    a[i] = b;
    a[0] = n + 1;

    for (j = 1; j <= a[0]; j++)
    {
        printf("%5d \n", a[j]);
    }

    return 0;
}	

在上述代码中,我们从后往前移动数组中的元素,使得插入位置及其后面的所有元素都向后移动一位,然后在指定的位置插入新的元素。这个过程的时间复杂度为 O(n),其中 n 是线性表的长度。因为在最坏的情况下,我们可能需要移动线性表中的所有元素(当插入的位置是1时)。

删除元素#

#include <stdio.h>
#define MAX 100

int main()
{
    int a[MAX];
    // i存放要删除的数据元素的下标,n存放待操作的线性表的长度
    int i, j, n;
    scanf("%d%d", &i, &n);
    for (j = 1; j <= n; j++)
    {
        scanf("%d", &a[j]);
    }
    a[0] = n;
    for (j = i+1; j <= n; j++)
    {
        a[j-1] = a[j];
        
    }
    a[0] = a[0]-1;
    for (j = 1; j <= a[0]; j++)
    {
        printf("%5d\n", a[j]);
    }

    return 0;
}

插入、删除操作的时间复杂度分析#

假设线性表的长度为n,就插入而言,舍插入位置在第i个元素之前,i共有1~(n+1)种可能的情况,最好情况是i=n+1,移动元素次数为0,最坏情况是i=1,移动元素次数为n,一般来说,对于插入位置为i,则移动元素次数为n-1+i

单元 3 栈和队列#

单元 4 字符串#

单元 5 数组和广义表#

单元 6 树和二叉树#

单元 7 图#

单元 8 查找#

单元 9 排序#