鱼C论坛

 找回密码
 立即注册
查看: 2368|回复: 3

[技术交流] 顺序表学习笔记1

[复制链接]
发表于 2017-6-29 17:46:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 威斯布鲁特 于 2017-6-29 17:49 编辑

线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。第1个元素存储在线性表的起始位置,第i个元素的存储位置后面紧接着存储的是第i+1个元素。因此,顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。

假定线性的类型为ElemType,线性表的顺序存储类型用C语言描述为:

  1. #define MaxSize 50  // 定义线性表的最大长度
  2. typedef struct{
  3.     ElemType data [MaxSize] ;  // 顺序表的元素
  4.     int length;  // 顺序表的当前长度
  5. }SqList;  // 顺序表的类型定义
复制代码


这个顺序表结构用静态分配的一维数组表示的,也可以用动态分配的。在静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据将产生溢出,就会导致程序崩溃。

我以前一直以为动态分配就不是线性表的顺序表示,是链式表示。但后来我发现“动态分配并不是链式存储,同样还是属于顺序存储结构,其物理结构没有变化,依然是随机存取方式,只是分配的空间大小可以在运行时决定。”我想先研究静态分配的表示,所以动态分配后面再继续。

补充点干货,顺序表的特点:
  • 顺序表最主要的特点是可以进行随机访问特性,即通过首地址和元素序号可以在O(1)的时间内找到指定的元素。
  • 顺序表的存储密度高,每个结点只存储数据元素。
  • 顺序表逻辑上相邻的元素物理上也相邻,所以,插入和删除操作需要移动大量元素。
  • 评分

    参与人数 1鱼币 +5 收起 理由
    小甲鱼 + 5 支持楼主!

    查看全部评分

    本帖被以下淘专辑推荐:

    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

     楼主| 发表于 2017-7-2 00:18:51 | 显示全部楼层
    本帖最后由 威斯布鲁特 于 2017-7-12 21:53 编辑

    实现了顺序表的初始化操作,发现自己对pSq->data与pSq.data根本不了解,得回去填坑了
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <assert.h>
    4. #include <memory.h>

    5. #define MaxSize 50
    6. #define ElemType int

    7. //定义顺序表的静态数组表示
    8. typedef  struct{
    9. ElemType data[MaxSize];
    10. int length;
    11. }SqList,*pSqList;

    12. void InitSq(pSqList pSq);
    13. void test();

    14. int main()
    15. {
    16.     SqList s;
    17.     InitSq(&s);
    18.     return 0;
    19. }

    20. //初始化顺序表
    21. void InitSq(pSqList pSq)
    22. {
    23.     int i;

    24.     assert(pSq);  //判断是否开辟结构体空间

    25. //把线性表的每个元素初始化为0

    26. //方法1
    27. //  memset(pSq->data, 0, sizeof(ElemType)*MaxSize);

    28. //方法2
    29.     for(i=0; i<sizeof(pSq->data)/4; i++)
    30.     {
    31.         pSq->data[i] = 0;
    32.     }
    33.     pSq->length = 0;
    34. }
    复制代码
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2017-7-2 09:41:12 | 显示全部楼层
    补充下用到的库函数:
    c语言诊断_断言库函数#include<assert.h>
    assert

    #include <assert.h>
    void assert(int exp);
    assert宏用于为程序增加诊断功能。当assert(exp)执行时,如果exp为bool值false,则在标准出错输出流stderr输出一条如下所示的信息:

    Assertion failed: expression, file filename, line nnn

    然后调用abort终止执行。其中的源文件名filename和行号nnn来自于预处理宏__FILE__和__LINE__。

    如果<assert.h>被包含时定义了宏NDEBUG,那么宏assert被忽略。
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2017-7-9 23:14:54 | 显示全部楼层
    威斯布鲁特 发表于 2017-7-2 00:18
    实现了顺序表的初始化操作,发现自己对pSq->data与pSq.data根本不了解,得回去填坑了。

    pSq->data中pSq是一个指针,pSq->data表示该指针所指向结构的一个成员
    pSq.data中的pSq是一个结构体,“.”是结构成员运算符,优先级比(*p)中的"*"高。
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

    GMT+8, 2024-4-20 23:32

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表