模擬鍊錶。在圖論題程式設計中,通常要運用鄰接鍊錶資料結構。
由於動態指標比靜態的陣列的訪問慢,很多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 來儲存乙個空的陣列...