数据结构之概念与线性表

算法

算法特征:

1.有穷性

2.确定性

3.可行性

4.输入和输出

算法好坏评价:

  • 正确性
  • 可读性
  • 确定性
  • 健壮性(效率和低存储)

算法效率的度量:

  • 时间复杂度
  • 空间复杂度

线性表

  1. 顺序存储:线性表

  2. 链式存储 :

指针实现

  • 单链表、
  • 双链表
  • 循环链表  

静态链表(借助数组实现)

顺序表存储定义

使用数组静态定义:即存储空间一旦满,再加入新的数据将产生溢出。

#define Maxsize 50 //定义线性表的最大长度
typedf struct
{
    Elemtype *data;//顺序表的元素
    int length;     // 顺序表的当前长度

}Seqlist;  //顺序表的定义

使用数组动态定义:即存储数据的空间满时,可以使用realloc申请更大的空间,代替原来的空间。

#define MaxSize 100  //表的长度初始定义
typedef struct
{
    ElemType *data;    //指示动态分配数据的指针
    int MaxSize, length;  //数组的最大的容量和当前的个数
 } SqList;              //动态分配数据顺序表的类型定义

c语言动态申请空间:L.data=(Elemtype*)malloc(sizeof(Elemtype)*InitSize)

特点:‘

1.顺序表是一组地址连续的存储单元。故表中的元素逻辑顺序与物理顺序相同。

2.可以随机存储,且存储密度大。

3.缺点是在插入和删除需要移动大量元素。

顺序表插入

bool ListInsert(Sqlist &L, int i, ElemType e)
{
    //将元素e插入到顺序表L中的第i个位置
    if(i<1 || i > L.length +1) //判断i的位置是否有效
        return false;
    if(l.length >= MaxSize)  //当前存储已满
        return false;
    for(int j=L.length; j>=i; j--)   //找到插入i位置,并将其以及之后的元素后移
        L.data[j]= L.data[j-1];

    L.data[i-1] = e;
    L.length++;
    return true; 
}

此时插入的平均时间复杂度是O(n)。

顺序的删除

bool Listdele(Sqlist &L, int i, ElemType &e)
{
    //删除顺序表L中的第i个位置,并用e作为返还值
    if(i<1 || i > L.length +1) //判断i的位置是否有效
        return false;
    e = L.data[i-1];
    for(int j=i; j<L.length; j--)   //找到插入i位置,并将其以及之后的元素后移
        L.data[j-1]= L.data[j];
    L.length--;
    return true; 
}

此时删除的平均时间复杂度是O(n)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章