顺序表的介绍以及使用

1.线性表

1.概念

一对一的数据所组成的关系称为线性表,注意线性表是逻辑结构

线性表中的数据元素可以是各种各样的,但同一线性表中的元素必定具有相同的特性,即同一数据对象(26个英文字母),相邻的数据之间是一对一的关系,比如B字母节点(数据节点)前面是A字母节点,后面是C字母节点,线性表的特性如下:

(1) 存在唯一的一个被称为"第一个"的数据元素

(2) 存在唯一的一个被称为"最后一个"的数据元素

(3) 除了第一个外,集合中每一个数据元素只有一个前驱节点

(4) 除了最后一个外,集合中每个数据元素均只有一个后驱节点

注意:

1.线性表是一种数据内部的逻辑关系,与存储形式无关

2.线性表既可以采用连续的顺序存储(数组),也可以采用离散的链式存储(链表)

3.顺序表和链表都称为线性表

2.顺序表

1.概念

顺序表:顺序存储的线性表

链式表:链式存储的线性表,简称链表

顺序存储就是将数据存储到一片连续的内存中,在C语言环境下,可以是具名的栈数组,或者是匿名的堆数组。

存储方式不仅仅只是提供数据的存储空间,而是必须要能体现数据之间的逻辑关系。当采用顺序存储的方式来存放数据时,唯一能用来表达数据间本身的逻辑关系的就是存储位置。比如队列中的两个人,小明和小 花,如果小明在逻辑上排在相邻的小花的前面,那么在存储位置上也必须把小明存放在相邻的小花的前面。

 

2.基本操作

1.顺序表设计

一般而言,为了方便操作顺序表,需要一个专门管理顺序表的"管理结构体",管理结构体一般会包括:

(1) 顺序表总容量

(2) 顺序表当前最末元素下标位置

(3) 顺序表指针

 

初始化

所谓初始化就是建立一个不包含任何元素的顺序表,设置好管理结构体中 的表的总容量、末元素下标,申请好顺序表内存空间等系列准备工作。

增删节点

在顺序表中增加一个数据,可以有多种方式,比如在原数组的末尾增加,或者在原素组的头部增加,或者在中间任意一个位置增加,更具需求来定。

销毁顺序表

一个顺序最后不再需要,应当要释放其所占用的内存空间,这被称为顺序表的销毁。

 // 销毁顺序表
void deStory(sequeList *head)
{
    free(head->data);
    head->data = NULL;
    free(head);
    head = NULL;
}

最终代码如下

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <stdbool.h>



typedef int dataType;



// 顺序表管理结构体

typedef struct sequeList

{

    int cap; // 顺序表总大小

    int last; // 顺序表元素下标

    dataType *data; // 指向顺序表的首元素地址

}sequeList;



// 初始化顺序表

sequeList *init_seque(int cap)

{

    if(cap <= 0)

        return NULL;

    // 给顺序表管理结构体分配空间

    sequeList *head = malloc(sizeof(sequeList));

    if(head == NULL)

        return NULL;

   

    head->cap = cap;

    head->last = -1;

    head->data = calloc(cap,sizeof(dataType));

    if(head->data == NULL)

        return NULL;



    return head;

}



// 判断表是否满

bool isFull(sequeList *head)

{

    if(head->cap == head->last+1)

        return true;

    return false;

}



// 插入数据

bool insert(sequeList *head, dataType data)

{

    if(head == NULL)

        return false;

    //判断数据是否已满

    if(isFull(head))

        return false;



    head->data[++head->last] = data;

    return true;

}



//删除指定数据

void removeData(sequeList *head,int Data)

{

    int i = 0;

    for(i = 0;i <= head->last;i++)

    {

        if(head->data[i] == Data)

            break;

    }

    for(int j = i;j < head->last;j++)

        {

            head->data[j] = head->data[j + 1];  

        }

        head->last--;

}



// 显示插入的数据

void showList(sequeList *head)

{

    for(int i = 0;i < head->last+1;i++)

    {

        printf("%d\n",head->data[i]);

    }

   

}

int main(int argc, char const *argv[])

{

    // 初始化表

    sequeList *head = init_seque(10);

    if(head == NULL)

    {

        printf("init failed\n");

        return -1;

    }

   

    for(int i = 0;i < 5; i++)

    {

        dataType data;

        scanf("%d",&data);

        // 将输入插入到表

        insert(head,data);

    }

    // 显示

    showList(head);

    removeData(head,44);

    showList(head);

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值