一、鏈表的特點
鏈表可以用來處理數據下標不連續,數據長度動態增加的情況。
常見的有單向鏈表、雙向鏈表和環形鏈表,本文記載單向鏈表的實現。
單向鏈表中,有顯式的域,data用來存儲該節點的數據,next指針指向下一個節點的地址,節點地址就是該節點在內存中的地址。
二、鏈表的實現
本文中採用c++實現鏈表的基本結構。
1.節點的基本結構
struct Node{
int data;//數據類型根據需要更改
Node *next;//指向下一個節點的指針。
}
2.插入節點至鏈表的結尾
#include <bits/stdc++.h>
using namespace std;
struct Node{
int data;//數據類型根據需要更改
Node *next;//指向下一個節點的指針。
};
Node *head,*p,*r;//鏈表的頭、當前、尾指針
int x;
int main(){
cin>>x;
head=new Node;
r=head;
while(x!=-1){//輸入-1代表輸入結束
p=new Node;
p->data=x;
p->next=NULL;
r->next=p;
r=p;
cin>>x;
}
return 0;
}
3.查詢鏈表中的元素
while(p->next!=NULL){
if(p->date==target){
cout<<"查詢到結果“<<endl;
}
}
三、非典型例子
洛谷:P3613 【深基15.例2】寄包櫃
https://www.luogu.com.cn/problem/P3613
採用如下鏈表配合數組實現,每一個櫃子用一個鏈表存儲(鏈表內部根據櫃子編號升序排列,提高查找效率),櫃子的根節點存在一個數組中,方便後期查找,
#include<bits/stdc++.h>
using namespace std;
struct Node {
int index;
int value;
Node *next;
} a[100001];
Node *head,*p,*r;
int main() {
int n,q;
int operate,obj,index,value;//操作、格子對象、插入(查詢)位置 、插入的值
cin>>n>>q;
for(int i=1; i<=n; i++) {
a[i].next=NULL;
}
for(int i=1; i<=q; i++) {
cin>>operate;
if(operate==1) {//插入
//插入時,先判斷該索引位置是否有元素,有-》判斷插入value值是否爲空,空-》刪除該節點 ;
//index從小往大了增加 ;
//相同位置插入,替換節點
cin>>obj>>index>>value;
//生成一個新節點
p=new Node;
p->next=NULL;
p->index=index;
p->value=value;
bool flag=false;//定義是否已經查入過節點了
//插入點初始化爲數據根節點
r=&a[obj];
//判斷是否有下一個節點
while(r->next!=NULL&&r->next->next!=NULL) {
//移動插入點到下一個節點
Node *father,*son;
father = r;
r=r->next;
son=r->next;
//如果插入點節點的index==當前新輸入的index,替換該節點
if(r->index==index) {
//輸入的節點值爲0,需要刪除插入點節點
if(p->value==0) {
//刪除節點,把下一個節點連接到當前節點的父親節點。
father->next=r->next;
} else {
r->value=value;
}
flag=true;
break;
} else if(p->index>r->index&&son->index>p->index) {
//插入點在當前節點和下一個節點的中間
p->next=son;
r->next=p;
flag=true;
break;
} else if(p->index<r->index) {
p->next=r;
father->next=p;
flag=true;
break;
}
}
if(!flag) {
if(r->next!=NULL) {
r=r->next;
}
if(r->index==p->index){
r->value=p->value;
}else{
r->next=p;
flag=true;
}
}
} else {
cin>>obj>>index;
Node *node=&a[obj];
while(node->next!=NULL) {
node=node->next;
if(node->index==index) {
printf("%d\n",node->value);
break;
}
}
}
}
//查看鏈表結構
// Node *temp;
// for(int i=1; i<=20; i++) {
// temp=&a[i];
// printf("第%d個鏈表:",i);
// while(temp->next!=NULL) {
// temp=temp->next;
// printf("[元素%d,值%d] ",temp->index,temp->value);
//
// }
// printf("\n");
// }
return 0;
}