#1思维导图

 

 #2重要概念及代码

##1.线性表:数据元素的排列方式是线性的。

###1.线性表分为顺序表和链表,链表又分为单链表、双链表和循环链表。

####1。它们三者的区别:

##### 1、它们都有数据域(data(p))和指针域(next(p)),但是从图中可以看出双链表有两个指针域,一个指向它的前节点,一个指向它的后节点。

#####2、单链表最后一个节点的指针域为空,没有后继节点;循环链表和双链表最后一个节点的指针域指向头节点,下一个结点为头节点,构成循环;

#####3、单链表和循环链表只可向一个方向遍历;双链表和循环链表,首节点和尾节点被连接在一起,可视为“无头无尾”;双链表可以向两个方向移动,灵活度更大。

##2.栈:先进后出,只能在栈顶进行插入和删除的操作。

###1.栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。

压栈:栈的插入操作,叫做进栈,也称压栈、入栈。

弹栈:栈的删除操作,也叫做出栈。

###2.栈的应用:表达式求值,内存分配,缓冲处理,迷宫等

##3.队列:先进先出(FIFO)

###1.队列又分为顺序队列和循环队列

###2.生活实例:买车票排队,排头最先买到车票,新来的排的队尾;进车站时,安检行李,先进去的最先出来,后进去的后出来。

##3.串:字符串一旦创建不可再改变。

···
//初始化表
 void InitList(SqList *&L)
    {
        L=new SqList;//为线性表分配空间
        L->length=0;
    }
//销毁线性表
void DestoryList(SqList* &L)
{
    delete L;//释放L指向的内存空间
}
//获取元素
bool GetElem(SqList *L,int i,ElemType &e)
{
     if(i<1||i>L->length)
     return false;
     e=L->data[i-1];
     return true;
}
//插入元素
bool ListInsert(SqList *&L,int i,ElemType e)
{
      if(i<1||i>L->length)
      return false;
      i--;
      for(int j=L->length;j>i;j--)
      L->data[j] = L->data[j-1];
  

#3.时间复杂度的求解##1.定义:一个程序的空间复杂度是指运行完一个程序所需内存的大小。

##2.大O表示法:用O(n)来体现算法时间复杂度的记法。

##3有三种规则:

用常数1取代运行时间中的所有加法常数
只保留最高阶项
去除最高阶的常数
##4.如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

##5.如果算法的执行时间随着问题规模n的增长而增长,则时间复杂度可通过计算得到为O(n)、O(log n)、O(n2)……

##6.常见时间复杂度的比较

O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)

##7KMP算法是一个模式匹配算法,他最原始的方法就是从主串进行一个个的进行匹配,然后返回主串中模式串的第一个字母在主串中的位置,依次进行返回就能查出有多少子串。然后对于有些模式串返回时会有一些无必要的比较,所以要用算法进行优化处理,使其算法的时间复杂度由O(n*m)简化为O(n+M);