数据结构——线性表

逻辑结构------线性表

1.线性表的定义(逻辑结构)

要点:

  • 相同数据类型

  • 有限

  • 序列
    几个概念:

  • 是线性表中的"第i个"元素线性表中的位序

  • 是表头元素;是表尾元素。

  • 除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继

  • ⭐注意:位序从1开始,数组下标从0开始


物理结构------顺序表

顺序表,按数组理解即可。

2.顺序表 (物理结构)

顺序表:用顺序存储的方式实现线性表。

把逻辑上相邻的元素 存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。


物理结构------链表

什么是链表?

链表是一种通过指针串联在一起的线性结构。

每一个节点由两部分组成,一个是数据域 data ,一个是指针域 next(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

3.单链表(物理结构)

单链表:每个结点除了存放数据元素外,还要存储指向下一个节点的指针。

单链表中的指针域只能指向节点的下一个节点。

单链表代码:

  • head 表示头结点的下标
  • ei 表示结点i的值
  • nei 表示节点i的next指针是多少
  • idx 存储当前已经用到了哪个点

头插法

cpp 复制代码
//头插法
void head_insert(int x){
	e[idx]=x;
	ne[idx]=head;
	head=idx;
	idx++;
} 

一般插入

cpp 复制代码
//在第k个插入的数后插入一个数
void insert(int k,int x){
	//插入的是第k+1个数,下标是k
	 e[idx]=x;
	 ne[idx]=ne[k];
	 ne[k]=idx;
	 idx++;
} 

全部代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+6;
int head,e[N],ne[N],idx;
//初始化
void initial(){
	head=-1,idx=1;
} 
//头插法
void head_insert(int x){
	e[idx]=x;
	ne[idx]=head;
	head=idx;
	idx++;
} 

//在第k个插入的数后插入一个数
void insert(int k,int x){
	//插入的是第k+1个数,下标是k
	 e[idx]=x;
	 ne[idx]=ne[k];
	 ne[k]=idx;
	 idx++;
} 
//删除第k个插入的数后面的数
void move(int k){
	//k=0时, 
	if(k==0)
		head=ne[head];
	else
		ne[k]=ne[ne[k]];
} 
int main(){
	int m;
	cin>>m;
	//初始化
	memset(ne,-1,sizeof ne); 
	initial();
	//cout<<ne[1]<<ne[10];
	while(m--){
		char a;
		cin>>a;
		if(a=='H'){
			int x;
			cin>>x;
			head_insert(x);
		}
		else if(a=='I'){
			int k,x;
			cin>>k>>x;
			insert(k,x);
		}
		else{
			//a==D
			int k;
			cin>>k;
			move(k);
		}
	}
	//cout<<ne[15];
	//输出
	for(int i=head;i!=-1;i=ne[i])
	{
		cout<<e[i]<<" ";
	} 
	return 0;
}

4.双链表(物理结构)

双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

双链表既可以向前查询也可以向后查询。

双链表插入

cpp 复制代码
//在第k个结点的右边插入一个结点
void r_insert(int k,int x){
	e[idx]=x;
	r[idx]=r[k];
	l[idx]=k;
	l[r[k]]=idx;
	r[k]=idx;
	idx++;
}
//在第k个结点的左边插入
void l_insert(int k,int x){
	r_insert(l[k],x); 
} 
//在最右侧插入
void right(int x){
	r_insert(l[1],x);
} 
//在最左侧插入
void left(int x){
	r_insert(0,x);
}

删除

cpp 复制代码
//删除第K个插入的数 
void remove(int k){
	r[l[k]]=r[k];
	l[r[k]]=l[k]; 
}

所有代码

cpp 复制代码
//双链表
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+6;
int l[N],r[N],idx,e[N];
//初始化
void init(){
	r[0]=1;
	l[1]=0;
	idx=2;
} 
//在第k个结点的右边插入一个结点
void r_insert(int k,int x){
	e[idx]=x;
	r[idx]=r[k];
	l[idx]=k;
	l[r[k]]=idx;
	r[k]=idx;
	idx++;
}
//在第k个结点的左边插入
void l_insert(int k,int x){
	r_insert(l[k],x); 
} 
//在最右侧插入
void right(int x){
	r_insert(l[1],x);
} 
//在最左侧插入
void left(int x){
	r_insert(0,x);
} 
//删除第K个插入的数 
void remove(int k){
	r[l[k]]=r[k];
	l[r[k]]=l[k]; 
}

int main(){
	int m;
	cin>>m;
	char op[6];
	int x;
	int k;
	init();
	while(m--){
		scanf("%s",&op);
		if(op[0]=='L'){
			cin>>x;
			left(x);
		}
		else if(op[0]=='R'){
			cin>>x;
			right(x);
		}
		else if(op[0]=='D'){
			cin>>k;
			remove(k+1);
		}
		else if(op[1]=='L'){
			cin>>k>>x;
			l_insert(k+1,x);
		}
		else{
			cin>>k>>x;
			r_insert(k+1,x);
		}
	}
	//output
	for(int i=r[0];i!=1;i=r[i]) {
		cout<<e[i]<<" ";
	}
	return 0;
	
}



 
相关推荐
by2099914 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
Code_Solitude14 小时前
c语言:关于qsoet函数知识点
c语言·数据结构·算法
Pniubi15 小时前
快速排序(力扣基础)(递归)
java·数据结构·算法
inrichtt1 天前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
HPtiger1 天前
数据结构——选择排序
数据结构·算法·排序算法
丑梨数据1 天前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
烂蜻蜓1 天前
Pandas入门教程(四):Series数据结构——创建、索引与常用方法
数据结构·pandas
CS创新实验室1 天前
一棵树怎么做到“自平衡还不太费力“?——红黑树的旋转与染色
数据结构·算法·红黑树·408·计算机考研
Logic1011 天前
C语言/数据结构位运算题解:异或XOR找出被挑选一次的果子编号——只出现一次的数字
c语言·数据结构·算法·数组·位运算·时间复杂度·空间复杂度
从小白到软工2 天前
4-3 项目-学生成绩管理系统(上)
c语言·开发语言·数据结构·经验分享·ai编程