目录
线性表的概念
数据类型的一个核心概念就是线性表线性表的实现——可以通过不同的物理结构实现
顺序储存 | 顺序表 | |
链式储存 | 单链表 | 单向循环链表 |
双向循环列表 |
线性表是n个数据元素的有限序列,记为(a1,a2,a3,,an),其含义如下:
- n为数据元素的个数,也可以称为线性表的长度,当n为0时,线性表称为空表。
- a为线性表中的第i个数据元素(也可以称为数据结点),i称为数
- 据元素在线性表中的位序(等同于数组元素的下标)
从线性表的定义可以看出,线性表中存在唯一的首个数据元素 ai 和唯-的末尾数据元素an。除了首个数据元素,其他每个数据元素都有一个直接前驱(a的直接前驱为a-1);除了末尾数据元素,其他每个数据元素都有一个直接后继(a的直接后继为a+1)
线性表的运算
并非所有运算,也并非一定同时使用
置空 | 将线性表变成空表 |
求长度 | 获取线性表数据结点的个数 |
取结点 | 取出线性表中某个数据结点 |
定位 | 获取某个指定的线性表 |
插入 | 将数据结点插入到线性表的指定位置 |
删除 | 删除线性表中的指定数据结点 |
顺序表
顺序表的定义
#define N 32
typedef int datatype_t;
typedef struct
{
datatype_t data[N];
int last; //顺序表中的最后一个结点的下标值
}seqlist_t;
由以上代码可知,结构体中的第1个成员为一维数组,使用该数组表示顺序表(因为数组中的元素在计算机内存中连续存储),数组中保存的元素为顺序表的数据结点;结构体中的第2个成员last表示数组的下标,其初始值为-1,表示数组中没有数据结点,每插入一个数据结点,last的值加1
顺序表的创建
#include<stdio.h>
#include<stdlib.h>
#define N 32
typedef int datatype_t;
typedef struct
{
datatype_t data[N];
int last; //顺序表中的最后一个结点的下标值
}seqlist_t;
//子函数
seqlist_t *seqlist_create()
{
//使用malloc()函数在内存中申请一块连续的空间,大小为sizeof(seqlist_t)
seqlist_t *sl=(seqlist_t*)malloc(sizeof(seqlist_t));
s1->last=-1;
return s1;
}
int main()
{
seqlist_t *sl; //定义结构体指针
sl=seqlist_create();//调用子函数创建空的顺序表
return 0;
}
创建空的顺序表只需为结构体在内存上申请一块连续的空间,并将数组下标last设置为-1,表示顺序表中没有任何结点
插入数据结点
1.不指定位置插入
int seqlist_full(seqlist_t *l)
{
return l->last==N-1?1:0;
}
int seqlist_insert(seqlist_t *l,int value)
{
if(seqlist_full(l))
{
printf("seqlist full\n");
return -1;
}
l->last++; //表示要插入数据
l->data[1->last]=value;//插入数据
return 0;
}
2.指定位置插入
int seqlist_pos_insert(seqlist_t *l,int pos,datatype_t value)
{
int i=0;
if(seqlist_full(l))
{
printf("seqlist full\n");
return -1;
}
//判断插入位置是否合理
if(pos<0||pos>l->last+1)
{
printf("pos value invalied input\n");
return -1;
}
//通过for 循环将顺序表中大于pos的结点依次向后移动一个储存单元
for(i=l->last+1;i>pos;i--)
{
l->data[i]=l->data[i-1];
}
//将新的结点赋值到数组的指定位置
l->data[i]=value;
l->last++;
return 0;
}
3.显示数据结点
int seqlist_show(seqlist_t *l)
{
int i=0;
for(i=0;i<=l->last;i++)
{
printf("%d\n",l->data[i]);
}
printf("\n");
return 0;
}
4.整体测试
#include<stdio.h>
#include<stdlib.h>
#define N 32
typedef int datatype_t;
typedef struct
{
datatype_t data[N];
int last; //顺序表中的最后一个结点的下标值
}seqlist_t;
int seqlist_full(seqlist_t *l)
{
return l->last==N-1?1:0;
}
int seqlist_insert(seqlist_t *l,int value)
{
if(seqlist_full(l))
{
printf("seqlist full\n");
return -1;
}
l->last++; //表示要插入数据
l->data[l->last]=value;//插入数据
return 0;
}
int seqlist_pos_insert(seqlist_t *l,int pos,datatype_t value)
{
int i=0;
if(seqlist_full(l))
{
printf("seqlist full\n");
return -1;
}
//判断插入位置是否合理
if(pos<0||pos>l->last+1)
{
printf("pos value invalied input\n");
return -1;
}
//通过for 循环将顺序表中大于pos的结点依次向后移动一个储存单元
for(i=l->last+1;i>pos;i--)
{
l->data[i]=l->data[i-1];
}
//将新的结点赋值到数组的指定位置
l->data[i]=value;
l->last++;
return 0;
}
//显示数据结点
int seqlist_show(seqlist_t *l)
{
int i=0;
for(i=0;i<=l->last;i++)
{
printf("%d\n",l->data[i]);
}
printf("\n");
return 0;
}
//子函数
seqlist_t *seqlist_create()
{
//使用malloc()函数在内存中申请一块连续的空间,大小为sizeof(seqlist_t)
seqlist_t *sl=(seqlist_t*)malloc(sizeof(seqlist_t));
sl->last=-1;
return sl;
}
int main()
{
seqlist_t *sl; //定义结构体指针
sl=seqlist_create();//调用子函数创建空的顺序表
seqlist_full(sl);
seqlist_insert(sl,10);
seqlist_insert(sl,20);
seqlist_insert(sl,30);
seqlist_insert(sl,40);
seqlist_show(sl);
seqlist_full(sl);
seqlist_pos_insert(sl,0,5);
seqlist_pos_insert(sl,2,15);
seqlist_pos_insert(sl,4,25);
seqlist_pos_insert(sl,6,35);
seqlist_show(sl);
return 0;
}
运行结果如下
写在最后
👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!