陣列模擬鍊錶問題

2021-10-03 03:37:12 字數 1194 閱讀 6443

模擬鍊錶。在圖論題程式設計中,通常要運用鄰接鍊錶資料結構。

由於動態指標比靜態的陣列的訪問慢,很多oi選手就用陣列模擬指標。

現在就來學習一下這種方法的程式設計。

有n個點,編號從1到n。有m條邊,每條邊用連線的2個頂點表示,如:(3,8),

表示頂點3和8之間的邊(無向邊)。請輸出每個頂點通過邊相鄰的頂點。

輸入格式:

第1行,n和m兩個整數,n範圍在[1…5000],m範圍在[1…100000];

下面有m行,每行兩個整數,表示一條邊。

輸出格式:

n行,第i行的第1個數k表示有多少邊和i號頂點相連,後面有k個數,表示哪k個頂點和i連線為一條邊。

輸入樣例:

5 61 3

2 41 4

2 33 5

2 5輸出樣例:

2 4 3

3 5 3 4

3 5 2 1

2 1 2

2 2 3

#include

using

namespace std;

struct node

;node adj[

5002

],a[

100001*2

];int fa=0;

void

insert

(int u,

int v)

intmain()

for(

int i=

1;i<=n;i++

)return0;

}

有對insert (int u,int v)感到疑惑的嗎?他起什麼作用,為啥要insert(u,v)然後再insert(v,u)嗎?我比較笨,一直搞不懂

我把整個執行過程模擬了一遍,大概明白了什麼意思。這個過程就是建鍊錶的過程,最開始,煉表表頭adj[u].next=0, 輔助記錄插入資料v的鍊錶值,adj[u].v輔助記錄v出現的次數。建立乙個新的節點後,把鍊錶節點的v賦值,把adj[u].next值(第一次為0)賦值給a[fa].next,把fa就是a在陣列中的位置告訴adj[u].next,再次遇到u這個數是,重複上面的操作,把adj[u].next賦值給a[fa].next(這時fa已經加1了),再把a的位置賦值給adj[u].next,,這樣, 就和上乙個a[fa-1].next的鍊錶就建立了,倒序建立的,adj[u].next 記錄的就是a[u]的表頭位置。

陣列模擬鍊錶

單鏈表 include using namespace std int head 1 idx 0,e 100005 ne 100005 void add head int x void remove int k void add int k,int x intmain else if a d 刪除元...

陣列模擬鍊錶

單鏈表 實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按...

陣列模擬鍊錶(靜態鍊錶)

為了模擬鍊錶的操作,設定了乙個date 資料 以及cur 相當於指標域 typedef struct list list s size size為陣列大小 我們用s size 1 cur來起頭指標的作用,指向鍊錶的第乙個元素的下標。因為不能直接malloc出來乙個空間,需要s 0 來儲存乙個空的陣列...