《大话数据结构》读书笔记(三)

来源:互联网 发布:传奇霸业法师武魂数据 编辑:程序博客网 时间:2024/05/21 08:51

线性表

零个或多个数据元素的有限序列。

线性表的顺序存储结构

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

C语言描述线性表的顺序存储结构

/** * 描述顺序存储结构需要三个属性: * 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。 * 线性表的最大存储容量:数组长度MaxSize * 线性表的当前长度: length */#define MAXSIZE 20  /*存储空间初始分配量*/typedef int ElemType;   /*ElemType类型根据实际情况而定,这里假设为int*/typedef struct {    ElemType data[MAXSIZE];     /*数组存储数据元素,最大值为MAXSIZE*/    int length;     /*线性表当前长度*/}SqList;

数据长度与线性表长度区别

在任何时刻,线性表的长度应该小于等于数组的长度。

顺序存储结构的代码实现

#include <stdio.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20  /*存储空间初始分配量*/typedef int ElemType;   /*ElemType类型根据实际情况而定,这里假设为int*/typedef struct {    ElemType data[MAXSIZE];     /*数组存储数据元素,最大值为MAXSIZE*/    int length;     /*线性表当前长度*/}SqList;typedef int Status;/*** 获得元素操作* Status是函数的原型,其值是函数结果状态代码,如OK等* 初始条件:顺序线性表L已存在* 操作结果:用e返回L中第i个数据元素的值*/Status GetElem(SqList L, int i, ElemType *e){    if (L.length == 0 || i < 1 || i > L.length)    {        return ERROR;    }    *e = L.data[i - 1];    return OK;}/*** 插入操作*/Status ListInsert(SqList *L, int i, ElemType e){    int k;    //线性表已满    if (L->length == MAXSIZE) {        return ERROR;    }    //i不在范围中    if (i < 1 || i > L->length + 1) {        return ERROR;    }    if (i <= L->length)    {        for (k=L->length-1; k >=i-1; k--) //将要插入位置后数据元素向后移动一位        {            L->data[k+1] = L->data[k];        }    }    L->data[i - 1] = e;    L->length++;    return OK;}/*** 删除操作*/Status ListDelete(SqList *L, int i, ElemType *e){    int k;    //不能为空    if (L->length == 0)    {        return ERROR;    }    //删除位置不正确    if (i < 1 || i > L->length)    {        return ERROR;    }    *e = L->data[i - 1];    if (i < L->length)    {        for (k = i;k < L->length;k++)        {            L->data[k-1] == L->data[k];        }    }    L->length--;    return OK;}int main(void){    SqList list = { {1,2,3,4}, 4 };    int key = 3;    ElemType result;    /*测试GetElem*/    GetElem(list,key, &result);    printf("获得元素操作结果%d\n", result);    /*测试ListInsert*/    ElemType value = 123;    ListInsert(&list,key,value);    printf("获得元素操作结果%d\n", list.data[--key]);    /*测试ListDelete*/    ListDelete(&list,key,&result);}

线性表顺序存储结构的优缺点

优点

  • 无须为表示表中元素之间的逻辑关系而增加额外的存储空间
  • 可以快速地存取表中任意位置的元素

缺点

  • 插入和删除操作需要移动大量元素
  • 当线性表长度变化较大时,难以确定存储空间的容量
  • 造成存储空间的“碎片”
原创粉丝点击