鏈表及其簡單應用

<font size=4> ##什麼是鏈表 鏈表其實和數組同樣,能夠存儲一串元素.但又與數組不一樣,那就是數組是如下標進行存儲的,例如a[1],a[2],a[3]等,而鏈表則是根據許多數字的先後關係的數字進行存儲的,其原理相似於圖論中的[鄰接表](https://blog.csdn.net/ronaldo7_zyb/article/details/78886844),所存儲的序列並非有序的,而是存儲這個數的前面(next)和這個數的後面(pre)來獲得這一串有序的序列的,儘管其存儲方式相對零散但卻十分方便.ios


##鏈表與數組/鏈表的優勢與缺點c++

刪除與插入:

在添加與存儲方面,鏈表要比數組更爲方便,下列圖中更能說明. 1.這是數組刪除和插入的操做圖解: 數組的刪除與插入 2.這是鏈表的刪除與插入操做圖解: 鏈表的刪除與插入 ###鏈表與數組的存儲 有100000行數組,每行數據最多有100000,但最後只有800000的數據,怎麼辦呢? 1.數組:a[100000][100000].......?? 2.鏈表:這個十分合適,咱們能夠用一個數組head存儲每一行數據的頭,跟劇每個頭去肯定每一行數列的順序,這樣就能夠吧空間壓縮到了線性,那麼就能夠方便存儲了. ###查詢 數組能夠實現O(1)查詢,可是鏈表倒是須要經過遍歷的,在這一方便時間複雜度並非最優的數組


##鏈表遍歷元素 跟劇first[]數組(存儲每一串數的開頭位置)呢Link[](存儲鏈表內買一個元素的信息)進行實現,next表示下一個節點的指針,data表示具體數值. 具體代碼以下:spa

for (int i=first[k];i!=0;i=Link[i].next])
    cout<<Link[i].data<<' ';
cout<<"\n";

##插入刪除元素 同圖解.1.插入:將前一個元素的next指向插入的節點,將前一個這個元素的next指向原來元素指向的next節點便可 2.刪除:將前一個元素的next直接指向當前刪除元素的next便可.net


##具體例題詳解:鏈表操做 給定m個操做,規定: 1.輸入一個數據,在尾部插入 2.輸入一個數據,查詢鏈表中是否有這個數據 3.輸入一個數據,在鏈表中刪除最前面的這個數 4.輸出鏈表 代碼以下:指針

#include<bits/stdc++.h>
using namespace std;
struct Linknote
{
	int data,next,pre;
}Link[10000];
int first=0,last=0,cnt=0;
void Push(int num)
{
	Link[last].next=++cnt;
	Link[cnt].data=num;
	Link[cnt].pre=last;
	Link[cnt].next=0;
	last=cnt;
	if (!Link[cnt].pre) first=cnt;
	return;
}
void Ask(int num)
{
	for (int i=first;i!=0;i=Link[i].next)
		if (num==Link[i].data) 
		{
			cout<<"yes\n";
			return;
		}
	cout<<"no\n";
	return;
}
void Pop(int num)
{
	for (int i=first;i!=0;i=Link[i].next)
		if (Link[i].data==num)
		{
			if (i==first) first=Link[first].next,Link[first].pre=0;
			else if (i==last) last=Link[last].pre,Link[last].next=0;
			else 
			{
				int P=Link[i].pre,N=Link[i].next;
				Link[P].next=N;
				Link[N].pre=P;
			}
			if (!first) last=0;
			return;
		}
	return;
}
void Write()
{
	for (int i=first;i!=0;i=Link[i].next)
		cout<<Link[i].data<<' ';
	cout<<endl;
	return;
}
int main()
{
	ios::sync_with_stdio(false);
	int m;cin>>m;
	for (int i=1;i<=m;i++)
	{
		int k,x;cin>>k;
		if (k!=4) cin>>x;
		if (k==1) Push(x);
		if (k==2) Ask(x);
		if (k==3) Pop(x);
		if (k==4) Write();
	}
	return 0;
}
相關文章
相關標籤/搜索