认知链表就需要从他属于的逻辑结构开始说
逻辑结构的分类:
1.集合结构(各个元素间没有关联)。
2.线性结构(数据间存在1对1的关系)。
3.树(数据间存在一对多或多对一的联系)。
4.图(数据间为多对多的关系)。
而链表就属于其中的线性结构,那么我们就需要了解线性结构的优点和缺点从而来帮助我们更好地理解链表的应用环境。
链表的优缺点:
优点:
1.不需要提前分配存储空间,元素个数不受限制
2.对于插入删除操作,在已找到目标位置的前提下,效率很高,仅需处理元素之间的引用关系,时间复杂度为O(1)。
缺点:
1.实现相对复杂
2.查找效率较低,最坏情况下需要遍历整张表
3.由于物理存储位置不固定,需要额外存储数据元素之间的逻辑关系。
代码的实现
链表的定义
#include<bits/stdc++.h>
using namespace std;
struct Node { //链表中的每个节点都是由两个变量构成的,一个用来存值,一个用来建立与下一个节点之间的联系
int data;
Node *next;
};
int main() {
Node *n1 = new Node(); //新节点的定义
Node *n2 = new Node();
Node *n3 = new Node();
n1 -> data = 1; //节点的赋值
n2 -> data = 2;
n3 -> data = 3;
n1 -> next = n2; //建立关联性
n2 -> next = n3;
return 0;
}
链表的插入
Node *List = new Node(); //新的头节点
int append (int value) { //value为插入节点的值
Node *n = new Node(); //想要插入的节点
n -> data = value;
n -> next = NULL;
Node *p;
p = List;
while (p -> next != NULL) {
p = p -> next;
}
p -> next = n;
}
链表的删除
void del (int w) {
int j = 0;
Node *p1, *p2;
p1 = List;
p2 = List;
while (++j != w) {
p1 = p1 -> next;
}
j = 0;
while (j != w) {
p2 = p2 -> next;
++j;
}
p1 -> next = p2 -> next;
}
统计节点个数
int count () {
int num = 0;
Node *p;
p = List;
while (p -> next != NULL) {
p = p -> next;
num++;
}
return num;
}
链表的打印
void show () {
Node *p = List;
while (p != NULL) {
cout << p -> data << endl;
p = p -> next;
}
}
查找节点
int found(int f) {
int ans = 0;
Node *p;
p = List -> next;
while (p != NULL) {
if (f == p -> data) {
ans++;
return ans;
} else {
ans++;
}
p = p -> next;
}
return 0;
}
清空链表
void clear() {
Node *p = new Node();
Node *q = new Node();
p = List -> next;
while (p) {
q = p -> next;
free(p); //逐个释放
p = q;
}
List -> next = NULL;
}