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;
}