數據結構:鏈表(洛谷P3613題解)

一、鏈表的特點

鏈表可以用來處理數據下標不連續,數據長度動態增加的情況。
常見的有單向鏈表、雙向鏈表和環形鏈表,本文記載單向鏈表的實現。
在這裏插入圖片描述單向鏈表中,有顯式的域,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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章