【数据结构基础】线性表—基础知识篇

目录

线性表的概念

线性表的运算

顺序表

顺序表的定义

顺序表的创建

插入数据结点

1.不指定位置插入

2.指定位置插入

3.显示数据结点

4.整体测试

写在最后 


线性表的概念

数据类型的一个核心概念就是线性表线性表的实现——可以通过不同的物理结构实现

顺序储存顺序表
链式储存单链表单向循环链表
双向循环列表

线性表是n个数据元素的有限序列,记为(a1,a2,a3,,an),其含义如下:

  1. n为数据元素的个数,也可以称为线性表的长度,当n为0时,线性表称为空表
  2. a为线性表中的第i个数据元素(也可以称为数据结点),i称为数
  3. 据元素在线性表中的位序(等同于数组元素的下标)

从线性表的定义可以看出,线性表中存在唯一的首个数据元素 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;
 }

运行结果如下

写在最后 

👍🏻点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅游星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值