系列文章目录
还在建设中提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
数据结构用链式结构与顺序结构描述了上万种神奇的算法与千奇百怪的结构,所以对两种结构的了解十分重要,本篇文章的目的便是介绍其中之一的链式结构。
让我们开始吧。
一、什么是链式结构?
对于我们智人来说,也许在你学习数据结构这门课之前也许脑海里只有顺序结构这一种结构,所以对于你来说也许链式结构难以想象,所以让我们一步一步来。
想象你在一个教室,老师希望通过一种方式,能通过一种方式能找到班上的所有人,很轻松想到的一个方法就是通过学号让学号相邻的同学在物理位置上同样相邻。但是这并非唯一的方法。试想如果在教室的每一个学生都记住了与自己学号相邻的学生的位置是不是通过任意一个学生,也可以找到任意一个其他学生的位置信息。
而这,其实也就是我们数据结构中所谓的“链式结构”。
二、代码实现
1.说明
如果大家已经开始思考如何用代码实现链式结构储存了,那么你可能遇到一个问题,就是如何把一个一个节点接入链表中,这里介绍两种方法。
头插法:每个节点直接接在head节点上,直到每个节点都接入链表。
尾插法:每个节点接在链表的最后,直到每个节点接入链表。
而在建立了单链表后则要进行单链表的维护即,增,删,改,查(后两者就是遍历)
2.头插法
代码如下(示例):
#include <iostream>
using namespace std;
int main(){
struct chain{
int value;
chain *next;
};
int n;
cin >> n;
chain *head=new chain;//init
head->next = NULL;
for(int i=1;i<=n;i++){//头插法具体实现。
chain *p = new chain;
p->next = head->next;
head->next = p;
cin >> p->value;
}
chain *p = new chain;//以下是单链表遍历。
p=head->next;
while(p!=NULL){
cout << p->value << " ";
p = p->next;
}
return 0;
}
3.尾插法
代码如下(示例):
#include <iostream>
using namespace std;
int main(){
struct chain{
int value;
chain *next;
};
int n;
cin >> n;
chain *head=new chain;//init
head->next=NULL;
chain *r = head;
for(int i=1;i<=n;i++){//尾插法具体实现
chain *p = new chain;
cin >> p->value;
r->next = p;
p->next = NULL;
r=p;
}
chain *p = new chain;//以下是单链表遍历。
p = head->next;
while (p!=NULL){
cout << p->value << " ";
p = p->next;
}
return 0;
}
4.删除节点
void mydelete(node* head) {//删除节点
int n;
cout << "请输入您想删除的节点下标";
cin >> n;
node* p = new node;
p = head;
for (int i = 1; i < n; i++) p = p->next;
p->next = p->next->next;
}
5.添加节点
void myadd(node* head) {//添加
cout << "请输入您想再何处添加何值,例:在第三号节点后添加一个数据域为3的节点";
int n;
node* p = new node;
node* q = new node;
cin >> n;
p = head->next;
for (int i = 1; i < n; i++) p = p->next;
q->next = p->next;
p->next = q;
cin >> q->data;
}
6.遍历
虽然在建表的步骤中写过了,但还是再写一遍。void bianli(node *head) {//遍历输出
node* p = new node;
p = head->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
}
总结
首次遇见链表可能会产生不适感,多加思考与练习便可。
下面这张图来自这位大佬的博客,我看着好用拿过来了,标注原出处