线性表-顺序表C语言实现

什么是线性表

线性表,全名为线性存储结构。使用线性表存储结构的方式可以理解,即“把所有的数据都用一根线串起来在存储到物理空间中”。

数据的“线性”结构
在这里插入图片描述

顺序存储结构和链式存储结构

  • 将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构,(简称顺序表);
  • 数据分散的存储在物理空间中,通过一根线保存他们之间的逻辑关系,这种存储结构称为链式存储结构;(简称链表);

前驱和后继

数据结构中,一组数据中的每个个体被称为“数据元素”(简称元素)。

  • 某一元素的左侧相邻的元素称为“直接前驱”,位于此元素左侧所有的元素都称为“前驱元素”
  • 某一元素的右侧相邻的元素称为“直接后继”,位于此元素右侧所有的元素都称为“后继元素”

在这里插入图片描述

顺序表(顺序存储结构)及初始化详解

顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。

顺序表的初始化

顺序表存储数据之前,除了申请足够大的存储空间之外,还要记录一下数据

  1. 顺序表申请的存储容量
  2. 顺序表的长度,也就是表中存储元素的个数
提示:正常状态下,顺序表申请的存储容量要大于顺序表的长度。

顺序表C语言实现代码:

// //顺序表自定义
// typedef struct Table{
//     int * head;    //声明了一个名为head的长度不确定的数组,也叫动态数组
//     int length;    //记录当前顺序表的长度 
//     int size;      //记录顺序表分配的存储容量
// }table;

// /*顺序表初始化
// 1、给Head动态数据申请足够大小的物理空间
// 2、给size、length赋初值
// */
// #define Size 5  //对Size进行宏定义,表示顺序表申请大小
// table initTable()
// {
//     table t;
//     t.head=(int*)malloc(Size*sizeof(int)); //构造一个空顺序表,动态申请存储空间
//     if(!t.head)     //出国申请失败,提示并退出程序
//     {
//         printf("初始化失败!\n");
//         exit(0);
//     }
//     t.length=0;   //空表的长度为0
//     t.size=Size;  //空表的初始化存储空间大小为Size
//     return t;
// }

/*
通过在主函数中调用 initTable 语句,就可以成功创建一个空的顺序表,
与此同时我们还可以试着向顺序表中添加一些元素,C 语言实现代码如下:
*/

#include<stdio.h>
#include<stdlib.h>
#define Size 5

typedef struct Table{
    int * head;    //声明了一个名为head的长度不确定的数组,也叫动态数组
    int length;    //记录当前顺序表的长度 
    int size;      //记录顺序表分配的存储容量
}table;

table initTable()
{
    table t;
    t.head=(int*)malloc(Size*sizeof(int)); //构造一个空顺序表,动态申请存储空间
    if(!t.head)     //出国申请失败,提示并退出程序
    {
        printf("初始化失败!\n");
        exit(0);
    }
    t.length=0;   //空表的长度为0
    t.size=Size;  //空表的初始化存储空间大小为Size
    return t;
}

 void diaplayTable(table t)
{
     for(int i=0;i<t.length;i++)
     {
         printf("%d ",t.head[i]);
     }
     printf("\n");
}

table addTable(table t,int elem,int add);//插入函数
table delTable(table t,int add);         //删除函数

int main()
{
    table t=initTable();
    for(int i=0;i<t.size;i++)
    {
        t.head[i]=i;
        t.length++;
    }
    printf("顺序表中存储的元素分别是:\n");
    displayTable(t);
    return 0;
}

//顺序表插入元素
//插入函数,其中elem为插入元素,add为插入位置
table addTable(table t,int elem,int add)
{
    if(add>t.length+1||add<1)
    {
        printf("插入位置有问题\n");
        return t;
    }

    //首先检查是不是有多余的存储空间提供插入元素
    if(t.length==t.size)
    {
        t.head=(int *)realloc(t.head,(t.size+1)*sizeof(int));
        if(!t.head)
        {
            printf("分配内存失败\n");
            return t;
        }
        t.size+=1;
    }
    //插入操作
    for(int i=t.length-1;i>=add-1;i--)
    {
        t.head[i+1]=t.head[i];
    }
    t.head[add-1]=elem;
    t.length++;         //长度加1
    return t;
}

//顺序表删除元素

table delTable(table t,int add) //add表示删除图标的位置
{
    if(add>t.length||add<1)
    {
        printf("被删除元素的位置有误\n");
        return t;
    }
    //删除操作
    for(int i=add;i<t.length;i++)
    {
        t.head[i-1]=t.head[i];
    }
    t.length--;
    return t;
}

// 顺序表查找元素
//查找算法:二分查找法、差值查找法
//此处使用顺序查找算法

int selectTable(table t,int elem)  //查找函数,elem表示要查找的数据元素的值
{
    for(int i=0;i<t.length;++i)
    {
        if(t.head[i]==elem)
        {
            return i+1;
        }
    }
    return -1;
}

//顺序表更改元素
/*
1、找到目标元素
2、直接修改元素值
*/
table amendTable(table t,int elem,int newElem)
{
    int add=selectTable(t,elem);
    t.head[add-1]=newElem;
    return t;
}








©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页