ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构 数组和链表

2021-12-07 14:32:10  阅读:124  来源: 互联网

标签:node 结点 线性表 元素 next 链表 vector 数组 数据结构


目录


一、线性表

1.线性表
由同类型数据元素构成有序序列的线性结构。表起始位置称表头,表结束位置称表尾。
除第一个元素无直接前驱,最后一个元素无直接后继之外,其他每个数据元素都有一个前驱和后继。
2.广义表
广义表是线性表的推广。对于线性表而言,n个元素都是基本的单元素,但广义表中,这些元素不仅可以是单元素也可以是另一个线性表甚至广义表。

二、顺序存储结构(数组)

1.顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素,且中间数据都有前端和后端,即逻辑结构相邻且物理结构也相邻。
2.优点:

  • 存储密度大(结点本身所占存储量/结点结构所占存储量),无须为表示表中元素之间的逻辑关系而增加额外的存储空间。
  • 可以快速地存取表中任—位置的元素,存与读数据时,时间复杂度是O(1),即随机存取。

3.缺点:

  • 线性表的容量一经定义就难以扩充。
  • 在插入和删除线性表的元素时,需要移动大量的元素,浪费时间。
  • 在线性表的长度不确定时,必须分配最大存储空间,使存储空间得不到充分利用。

三、链式存储结构(单链表)

1.链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。线性表的链式表示又称为非顺序映像或链式映像。
2.基础信息:

  • 链表的基本单位为结点。结点可分为数据域和指针域。存储数据元素信息的域为数据域,存储直接后继位置的域为指针域。
  • 链表中第一个结点的存储位置叫做头指针,之后的每一个结点,就是上一个的后继指针指向的位置。
  • 了更加方便地对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点。头结点的指针域存储指向第一个结点的指针。

注:一般要指定头结点。

3.优点:不要求大片连续空间,改变容量方便。删除元素方便

4.缺点:不可随机存取,要耗费一定空间存放指针。

单链表:(这边我还会改一下)

struct node {
	int data;
	node *next;
	node(int data = 0,node *next = NULL) {
		this->data = data;
		this->next = next;
	}
};

node *head,*q;     //head:头指针,链表从1开始计数 
    	           //q:执行指针 , p 为临时指针 
void init() {
	*head = new node();
}
void print() {       //输出单链表 
	node *q = head -> next;
	while(q != NULL) {
		printf("%d",q->data);
		q = q->next;
	}
    puts("");
} 

bool insert(int n,int k) {  //插在第n个位置上,失败返回 0 
	node *q=head;
	int t = 0; //第0个位置	
	while(q != NULL) {	
		if(t == n-1) {
			node *p = new node();
			p->data = k;			
			p->next = q->next;			
			q->next = p;
			return 1;
		} 
		q = q->next;
		t ++;
	}
	return 0;  
} 

void push_back(int k) {  //插入队尾       
	node *q = head->next; 
	while(q != NULL) {
		q = q->next;
	}
	node *p= new node();
	p->data = k;
	p->next = NULL;
	q->next = p;
}

bool erase(int n) {  //删除第n个位置,败返回 0   
	node *p= new node();
	node *q = head->next;
	int t = 0; //第0个位置	
	while(q != NULL) {	
		if(t == n-1) {					
			p = q;
		} 
		if(t == n) {
			p->next = q->next;
		}
		q = q->next;
		t ++;
	}
	return 0;
}

四、STL 可变长数组 vector

1.vector 概念
vector 是可变长数组的顺序式容器,它的内部实现基于倍增思想,使用连续的存储位置来存储元素。vector 相比于数组,vector 消耗更多的内存,以换取管理存储和动态增长的能力。
vector 支持随机访问O(1),但它不支持在任意位置插入O(n)。为了保证效率,元素的增删应该在末尾进行。
注:头文件#include< vecto r>

2.vector 操作
(1)初始化

vector<Type> v              v 是一个空vector,执行默认初始化
vector<Type> v(n)           v 包含了n个重复地执行了值默认初始化的对象
vector<Type> v[n]           创建一个不规则二维数组 v,行为 n,列不确定

(2)基础操作

bool v.empty()               如果v不含有任何元素,返回真,否则返回假
int  v.size()                返回v中元素的个数
void v.clear()               清空数组
type v.front()               返回数组v 的第一个元素
type v.back()                返回数组v 的最后一个元素

(3)增删改查

void v.push_back(k)           向v的尾端添加一个值为k的元素
void v.pop_back()             删除尾部元素
void v.insert(v.begin()+i,k)  在第i个元素前插入k
void v.erase (v.begin()+l,v.begin()+r)  删除区间[l,r)

(4)操作符

v1 = v2           用v2中元素的拷贝替换v1中的元素
v1 == v2          当且仅当它们的元素数量相同且对应位置的元素值都相同时为真
< , <= , > , >=   以字典顺序进行比较
v[i]              返回第 i 位置的数,从 0 开始

五、STL 链表 list

1.list 概念
list 是数据结构的双向链表,它的内存空间可以是不连续的。通过指针来进行数据的访问,它可以高效率地在任意地方删除和插人,插入和删除操作是常数时间的。list 和 vetor 操作基本类似。
注:头文件 #include

六、STL 双端队列 deque

双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,deque类似于vector。
它是一个双端队列类模板,双端队列容器由若干个块构成,每个块中元素地址是连续的,块之间的地址是不连续的,有一个特定的机制将这些块构成一个整体,可以从前面或后面快速插入与删除元素,并可以随机访问元素O(1),但删除元素较慢。(vetor 是倍增思想)
注:头文件 #include < deque >

type s.push_front(K)          在队头插入元素K
type s.push_back(K)           在队尾插入元素K
void s.pop_front()            删除队头一个元素
void s.pop_back()             删除队尾一个元素

七、比较

1.deque 与 vector 比较
双端队列比vector多了可在两端进行 push、pop 但是缺点是占用内存多。
2.list 与 vector 比较
list和vector的优缺点正好相反,它们的应用场景不同。
vector:插入和删除操作少,随机访问元素频繁。
list:插入和删除频繁,随机访问较少。
3.vector 与 list 与 deque 比较
如果需要高效的随即存取,而不在乎插入和删除的效率,使用 vector。
如果需要大量的插入和删除,而不关心随机存取,则应使用 list。
如果需要随机存取,而且关心两端数据的插入和删除,则应使用 deque。

标签:node,结点,线性表,元素,next,链表,vector,数组,数据结构
来源: https://blog.csdn.net/qq_52122749/article/details/121752739

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有