鱼C论坛

 找回密码
 立即注册
查看: 1717|回复: 0

[学习笔记] 002-线性表及其顺序结构存储实现

[复制链接]
发表于 2018-9-23 11:42:12 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 moc 于 2018-9-23 11:43 编辑

1、线性表的基本概念
1.定义
    线性表(list)是由0个或多个元素组成的集合;
    线性表中的数据元素之间是有顺序的;
    线性表的数据元素个数是有限的;
    线性表中数据元素的类型必须相同
数学描述:
    线性表是具有相同类型的n(n≥0)个数据元素的有限序列(a1, a2, a3, ... , an),其中ai是表项,n是表的长度。
59s.png
2.性质
    a0为线性表的第一个元素,只有一个后继;
    an为线性表的最后一个元素,只有一个前驱;
    除了a0和an以外的元素,既有前驱又有后继;
    线性表能够逐项访问和顺序存取。
3.线性表的操作
    创建线性表;
    销毁线性表;
    清空线性表;
    将元素插入到线性表;
    将元素从线性表中删除;
    获取线性表某个位置的元素;
    获取线性表的长度等。
2、线性表的顺序存储结构
顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。
  这种存储结构需要提前根据存入元素的最大容量分配空间,一旦分配好,容量是固定的。
设计与实现:
#ifndef _MY_SEQLIST_H__
#define _MY_SEQLIST_H__
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef void SeqList;
typedef void SeqListNode;

// 根据容量创建并返回一个空的线性表
SeqList* SeqList_Create(int capacity);

// 销毁一个线性表
void SeqList_Destroy(SeqList* list);

// 清空一个线性表
void SeqList_Clear(SeqList* list);

// 获取线性表的长度
int SeqList_Length(SeqList* list);

// 获取线性表的容量
int SeqList_Capacity(SeqList* list);

// 在线性表的pos位置插入元素node
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

// 获取线性表pos位置的元素
SeqListNode* SeqList_Get(SeqList* list, int pos); 

// 删除线性表pos位置的元素
SeqListNode* SeqList_Delete(SeqList* list, int pos);

#endif
1. 插入元素算法
        判断线性表是否合法;
        判断插入位置是否合法;
        容错修正  插入位置大于当前长度但小于链表容量,自动添加到尾部;
        把最后一个元素到插入位置的元素一次向后移一个位置;
        将新元素插入;
        线性表长度加1.
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
        int i = 0, ret = 0;
        TseqList* tlist = NULL;
        tlist = (TseqList*)list;
        if (list == NULL || node == NULL || pos < 0)
        {
                ret = -1;
                printf("Fun SeqList_Insert() error: %d \n", ret);
                return ret;
        }

        if (pos >= tlist->capacity)
        {
                ret = -2;
                printf("链表已满: %d \n", ret);
                return ret;
        }

        // 容错修正  插入位置大于当前长度但小于链表容量,自动添加到尾部
        if (pos >= tlist->length)
        {
                pos = tlist->length;
        }

        //1.元素后移
        for (i = tlist->length; i > pos; i--)
        {
                tlist->node[i] = tlist->node[i - 1];
        }
        //2. 插入元素
        tlist->node[i] = node;
        tlist->length++;

        return 0;
}
2. 获取元素操作
        判断线性表是否合法;
        判断位置是否合法;
        直接通过数组下标的方式获取数组元素。
SeqListNode* SeqList_Get(SeqList* list, int pos)
{
        int i = 0, ret = 0;
        TseqList* tlist = NULL;
        tlist = (TseqList*)list;
        if (list == NULL || pos < 0 || pos > tlist->length)
        {
                ret = -1;
                printf("Fun SeqList_Get() error: %d \n", ret);
                return ret;
        }
        return tlist->node[pos];
}
3. 删除元素算法
        判断线性表是否合法;
        判断删除位置是否合法;
        将要删除的元素取出;
        把删除位置后的元素分别向前移一个位置;
        线性表长度减1.       
注意:线性表的容量和实际长度是两个不同的概念。
SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
        int i = 0, ret = 0;
        SeqListNode* tmp;
        TseqList* tlist = NULL;
        tlist = (TseqList*)list;
        if (list == NULL || pos < 0)
        {
                ret = -1;
                printf("Fun SeqList_Insert() error: %d \n", ret);
                return NULL;
        }
    // 缓存删除的结点
        tmp = (SeqListNode*)tlist->node[pos]; 
        // 结点前移
        for (i = pos + 1; i < tlist->length; i++)
        {
                tlist->node[i - 1] = tlist->node[i];
        }
        tlist->length--;
        return tmp;
}
3、顺序存储优点和缺点
优点:
        无需为线性表中的逻辑关系增加额外的空间;
        可以快速获取表中合法位置的元素。
缺点:
        插入和删除操作需要移动大量的元素;
        当线性表长度变化较大时难以确定存储空间的容量。

完整代码: 线性表顺序存储.zip (1.97 KB, 下载次数: 12)

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 02:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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