什么是线性表
线性表,全名为线性存储结构。使用线性表存储结构的方式可以理解,即“把所有的数据都用一根线串起来在存储到物理空间中”。
顺序存储结构和链式存储结构
- 将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构,(简称顺序表);
- 数据分散的存储在物理空间中,通过一根线保存他们之间的逻辑关系,这种存储结构称为链式存储结构;(简称链表);
前驱和后继
数据结构中,一组数据中的每个个体被称为“数据元素”(简称元素)。
- 某一元素的左侧相邻的元素称为“直接前驱”,位于此元素左侧所有的元素都称为“前驱元素”
- 某一元素的右侧相邻的元素称为“直接后继”,位于此元素右侧所有的元素都称为“后继元素”
顺序表(顺序存储结构)及初始化详解
顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。
顺序表的初始化
顺序表存储数据之前,除了申请足够大的存储空间之外,还要记录一下数据
- 顺序表申请的存储容量
- 顺序表的长度,也就是表中存储元素的个数
提示:正常状态下,顺序表申请的存储容量要大于顺序表的长度。
顺序表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;
}