文章目录
线性表—Linear List
相关概念
1、定义:n(n≥0)个数据元素的有限序列
2、线性表是一种最常用且最简单的数据结构,含有n个元素的线性表是一个数据结构
3、"一对一"逻辑关系
4、前驱后继:若将线性表记为 a 1 , a 2 , a 3 . . . a i − 1 , a i , a i + 1 . . . a n a_1,a_2,a_3...a_{i-1},a_i,a_{i+1}...a_n a1,a2,a3...ai−1,ai,ai+1...an,则称 a i − 1 a_{i-1} ai−1是 a i a_i ai的直接前驱元素, a i + 1 a_{i+1} ai+1是 a i a_i ai的直接后继元素。当i=1,2,3…n-1
时,ai有且仅有一个直接后继,当i=2,3,4…n时, a i a_i ai有且仅有一个直接前驱
5、线性表的元素的个数n(n≥0)定义为线性表的长度,当n=0时,称为空表
顺序表
定义
数据依次存储在连续的物理空间中,这种存储结构称为顺序存储结构,简称顺序表
优缺点
1、优点:
①无需为表中元素之间的逻辑关系增加额外的储存空间
②可以快速的存取表中任意位置的元素
2、缺点:
①插入和删除操作需要移动大量元素,效率慢
②数组一旦声明长度则不可以改变
③需要提前分配空间,难以确定储存空间的容量,分配得过多,会造成空间浪费,分配得过少,会导致溢出
时间复杂度
增加、删除、修改元素: O ( n ) O(n) O(n)
根据下标获取、修改元素: O ( 1 ) O(1) O(1)
链表-LinkList
定义
数据随机存储在物理空间中,这种存储结构称为链式存储结构,简称链表
优缺点
1、优点:
①插入和删除速度快,只需要改变指针的指向
②没有空间限制,存储元素无上限,只与内存空间大小有关
③动态分配内存空间,内存利用率变高
2、缺点:
①不能随机查找,必须从第一个开始遍历,查找效率低
时间复杂度
添加:add_to_head: O ( 1 ) O(1) O(1),add_to_tail: O ( n ) O(n) O(n),add_to_index: O ( n ) O(n) O(n)
删除:del_head: O ( 1 ) O(1) O(1),del_tail: O ( n ) O(n) O(n),del_index: O ( n ) O(n) O(n)
修改元素: O ( n ) O(n) O(n)
查找元素: O ( n ) O(n) O(n)
单链表操作
结构体
struct link {
int data;
link *next;
};
创建链表
//创建链表
link *create() {
link *p = new link;
p->next = NULL;
return p;
}
头添加
//头添加
void add_to_head(link *node, int n) {
link *p = new link;
p->data = n;
p->next = node->next;
node->next = p;
}
尾添加
//尾添加
void add_to_tail(link *node, int n) {
link *p = new link;
p->data = n;
p->next = NULL;
link *q = new link;
q = node;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
任意位置添加
//任意位置添加
void add_to_index(link *node, int index, int n) {
link *p = new link;
link *q = new link;
p = node;
q->data = n;
int i = 0;
while (i < index) {
p = p->next;
i++;
}
q->next = p->next;
p->next = q;
}
头删除
//头删除
void del_head(link *node) {
link *p = node->next;
if (p) {
node->next = p->next;
delete p;
}
}
尾删除
//尾删除
void del_tail(link *node) {
link *p = new link;
p = node;
while ((p->next->next) != NULL) {
p = p->next;
}
p->next = NULL;
}
任意位置删除
//任意位置删除
void del_index(link *node, int index) {
link *p = new link;
p = node;
int i = 0;
while (i < index) {
p = p->next;
i++;
}
while (p->next->next != NULL) {
p = p->next;
p->data = p->next->data;
}
p->next = NULL;
}
获取任意位置结点及对应的值
//获取结点
link *get_node(link *node, int index) {
link *p = new link;
p = node;
int i = 0;
while(i<index){
p = p->next;
i++;
}
return p->next;
}
//获取结点对应的值
int get_data(link *node,int index) {
link *p = new link;
p = node;
int i = 0;
while(i<index){
p = p->next;
i++;
}
return p->next->data;
}
修改指定的值为另一值
//修改指定的值n为num
void ch_data(link *node,int n,int num){
link *p = new link;
p = node;
while(p!=NULL){
if(p->data == n){
p->data = num;
}
p = p->next;
}
}
打印链表
//打印链表
void print(link *node) {
link *p = new link;
p = node->next;
while (p!=NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
完整代码
#include<bits/stdc++.h>
using namespace std;
struct link {
int data;
link *next;
};
link *create() { //创建链表
link *p = new link;
p->next = NULL;
return p;
}
void add_to_head(link *node, int n) { //头添加
link *p = new link;
p->data = n;
p->next = node->next;
node->next = p;
}
void add_to_tail(link *node, int n) { //尾添加
link *p = new link;
p->data = n;
p->next = NULL;
link *q = new link;
q = node;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
void add_to_index(link *node, int index, int n) { //任意位置添加
link *p = new link;
link *q = new link;
p = node;
q->data = n;
int i = 0;
while (i < index) {
p = p->next;
i++;
}
q->next = p->next;
p->next = q;
}
void del_head(link *node) { //头删除
link *p = node->next;
if (p) {
node->next = p->next;
delete p;
}
}
void del_tail(link *node) { //尾删除
link *p = new link;
p = node;
while ((p->next->next) != NULL) {
p = p->next;
}
p->next = NULL;
}
void del_index(link *node, int index) { //任意位置删除
link *p = new link;
p = node;
int i = 0;
while (i < index) {
p = p->next;
i++;
}
while (p->next->next != NULL) {
p = p->next;
p->data = p->next->data;
}
p->next = NULL;
}
link *get_node(link *node, int index) { //获取结点
link *p = new link;
p = node;
int i = 0;
while(i<index){
p = p->next;
i++;
}
return p->next;
}
int get_data(link *node,int index) { //获取结点对应的值
link *p = new link;
p = node;
int i = 0;
while(i<index){
p = p->next;
i++;
}
return p->next->data;
}
void ch_data(link *node,int n,int num){ //修改指定的值n为num
link *p = new link;
p = node;
while(p!=NULL){
if(p->data == n){
p->data = num;
}
p = p->next;
}
}
void print(link *node) { //打印链表
link *p = new link;
p = node->next;
while (p!=NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
link *p = create();
add_to_head(p, 10);
add_to_tail(p, 20);
add_to_tail(p, 30);
add_to_index(p, 3, 40);
print(p);
del_head(p);
del_tail(p);
del_index(p, 1);
ch_data(p,20,2);
print(p);
}
结语
第一次写博客,没什么经验,若有错误以及写的不明确的地方,还请在评论区指正或者联系我