混子数据结构学习之第二章线性表顺序表示

"磨棱角,褪优越,沉下心"
"不止于心动,更付诸于行动,执行力!“

前言

接着前面的线性表记录,本篇主要记录一下线性表的顺序表示相关的内容。这个上周我也基本学完啦,回顾整理一下。

顺序表示

定义:

线性表的顺序表示又称为顺序存储结构或顺序映像。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
逻辑上相邻,物理上也相邻
需要注意:强调的必须连续顺序存储,如果存储中中间有空缺的就不是一个线性表顺序存储结构了。

特点:

  • 以物理位置相邻表示逻辑关系;(一一对应的关系)
  • 任一元素均可随机存取。(优点)

线性表的顺序储存表示

地址连续、依次存取、随机存取、类型相同------可用数组来表示。
问题:线性表长度可变,数组的长度不可动态定义。
如下:



需要知道数组长度实际上也是可以动态变化的,可以实现的,但是会影响执行的效率各种,上面就默认说数组长度不可变,我们平时用其实也不去动态定义数组的长度。

定义的模板

为了解决不能直接使用数组来表示,数组不能动态分配长度的问题,下面就引入了这种定义。
我理解的是:先定义一个大小长度不可变的数组空间,然后线性表又在这个空间内进行任意分配,就是线性表的可变长度是在这个数组范围内的可变。

#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 
typedef  int  ElemType;//定义数据元素的类型为int型 (根据实际情况定义)
typedef struct{
    ElemType date[LIST_INIT_SIZE];//数组存储数据元素,最大存储长度为100
    int length;//当前长度 
}SqList;
需要明确几点:
  • 数组的长度是存放线性表的储存空间的长度大小,一般被定义后不可变。
  • 线性表的长度是线性表中数据元素的个数,可随线性表的删除、插入等操作变化。
  • 任意时刻,线性表的长度 <= 数组的长度
C语言补充
数组定义
  • 第一种静态分配空间
typedef struct{
    ElemType data[MaxSize];//定义数组
    int length; 
}SqList;//顺序表类型
  • 第二种动态分配空间
typedef struct{
    ElemType *data;//定义数组的基地址
    int length; 
}SqList;//顺序表类型
 
SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType) * MaxSize);//动态分配数组空间
解释:
  • ①malloc(m)函数,开辟m字节长度的地址空间,并返回这段空间的首地址。
    原型:extern void *malloc(unsigned int num_bytes);
    用法:#include <alloc.h>
    功能:分配长度为num_bytes字节的内存块
    说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
    当内存不再使用时,应使用free()函数将内存块释放。

  • ②sizeof(x)运算,计算变量x的长度。

  • ③free(p)函数,释放指针p所指变量的存储空间,即彻底删除一个变量。

线性表的顺序存储表示


存储结构分两部分:数据元素+线性表长度

#define MAXSIZE 100
typedef struct{
    ElemType *elem;
    int length; 
}SqList;//定义顺序表类型
 
SqList L;//定义变量L,L是SqList这种类型的,L是个顺序表
//就像
int a;//定义变量a,a是int型

基本操作实现

下面我给出完整的基本所有操作。
使用的编译器平台为:visual C++ 2010
使用的语言: C语言
需要注意的点:
1、需要注意形参变化是否会导致实参的变化,如果都变,一般使用指针,使他改变。
2、程序逻辑上需要考虑一些非法特殊情况。
3、测试代码的合理性

#include"stdio.h"
#include <stdlib.h>  // malloc, free, rand, system 

#define MAXSIZE 100
#define OK    1
#define FALSE 0
typedef int ElemType;

typedef struct
{
    ElemType *elem;//表的数据
    int length; //表长
}SqList;//定义顺序表类型
 
SqList List;//定义变量L,L是SqList这种类型的,L是个顺序表

//构造一个空的顺序表L 
unsigned char InitList_Sq(SqList *L)
{
    //L->elem = new ElemType[MAXSIZE];//C++中为顺序表分配空间 
    L->elem =(ElemType*)malloc(sizeof(ElemType) * MAXSIZE);//为顺序表分配空间 
    if(!L->elem)
    {
      return FALSE;//存储分配失败 
    }
    L->length = 0;//空表长度为0 
    return OK;
}

//销毁线性表
void DestroyList(SqList *L)
{
    if(!L->elem)
    {
        //delete L->elem;//C++中释放存储空间 
        free(L->elem);
    }
}

//清空线性表L
void ClearList(SqList *L)
{
    L->length = 0;//将线性表的长度置为0 
}
//求线性表L的长度
int GetLength(SqList L)
{
    return (L.length);
}
//判断线性表L是否为空
int IsEmpty(SqList L)
{
    if(L.length == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
//顺序表的取值(根据位置i获取相应位置数据元素的内容)
int GetElem(SqList L, int i, ElemType *e)
{
    if(i < 1 || i > L.length)//判断i值是否合理,若不合理,返回ERROR 
    {
        return FALSE;
    }
    *e = L.elem[i - 1];//第i-1的单元存储着第i个数据 
    return OK; 
}


//线性表L的输入 
void InputList(SqList *L, int n)
{
    int i, data;
    for(i = 0; i < n; i++)
    {
        printf("请输入第%d个数据元素:", i + 1);
        scanf("%d", &data);
        L->elem[i] = data;
        L->length++;
    }

}


//线性表L的输出 
void OutputList(SqList L)
{
    int i;
    for(i = 0; i < L.length; i++)
    {
        printf("%d ", L.elem[i]);
    }
    printf("\n");
}


void main()
{
    SqList L;//定义变量L,L是SqList这种类型的,L是个顺序表
    int choice, ans, n, i;
    ElemType e;

        printf("线性表的顺序表示和实现3(菜单):\n");
        printf("1、线性表的初始化 2、线性表的输入\n");
        printf("3、线性表的长度 4、线性表是否为空\n");
        printf("5、线性表的输出 6、线性表的取值\n");
        printf("7、线性表的清空 8、线性表的销毁\n");

    while(1)
    {
        printf("请输入菜单序号:\n");
        scanf("%d", &choice);

        switch(choice){
            case 1:
                InitList_Sq(&L);
                break;
            case 2:
                printf("请输入数据元素的个数:\n");
                scanf("%d", &n);
                InputList(&L, n);
                break;
            case 3:
                ans = GetLength(L);
                printf("线性表的长度是:%d\n", ans);
                break;
            case 4:
                ans = IsEmpty(L);
                if(ans)
                {
                    printf("线性表为空\n");
                }
                else
                {
                    printf("线性表不为空\n");
                }
                break;
            case 5:
                OutputList(L);
                break;
            case 6:
                printf("请输入取值位置:\n");
                scanf("%d", &i);
                ans = GetElem(L, i, &e);
                if(ans)
                {
                    printf("数据元素是:%d\n", e);
                }
                else
                {
                    printf("取值失败\n");
                }
                break;
            case 7:
                ClearList(&L);
                printf("线性表已清空\n");
                break;
            case 8:
                DestroyList(&L);
                printf("线性表已销毁\n");
                break;
        }
    }


}

运行如下:


参考资料:
青岛大学.王卓.数据结构与算法
《数据结构 C语言版》.严蔚敏
《大话数据结构》.程杰

欢迎关注本人微信公众号:那个混子
记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!
单片机类嵌入式交流学习可加企鹅群:120653336
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容