真 資料結構 鍊錶(基於陣列)

2021-08-15 16:30:11 字數 2415 閱讀 2136

1.顧名思義:鍊錶就是用一條鏈把資料連線起來。

我們可能在其他書中見過基於指標的鍊錶,但是鍊錶的實現不一定只依靠指標,還可以依靠陣列!

2.那麼怎麼創造鏈呢,用date陣列來儲存資料,用next陣列來儲存節點(即date陣列的下標),比如next[0]=1;next[1]=2;next[2]=3.......這樣就能由next[0]來不斷找到下乙個節點,沿著一條鏈找到所有資料!

4.核心**:next[i]=next[cur],next[cur]=i;cur=i;

5.例題1:uva11988 悲劇文字(單向鍊錶)

題意:簡述一下即將輸入的一句文字中,將用'['和']'括起來的內容提到句子首,其他順序不變!

思路:鍊錶中的頭結點總是指向鍊錶的第乙個元素。然後開始插入元素。

鍊錶中插入元素就兩句**:next[i]=head;head=i。第一句表示新元素i的下乙個元素指向當前head指向的元素,第二句話是更新head的指向,指向新的第乙個元素i。當所有元素插入完畢後,只需要從頭結點開始,順著next陣列即可按順序輸出整個鍊錶。字元的移動實際上是next【】中所存放的s【】的下標的移動 !!

**:

#include #include#include#includeusing namespace std;

const int maxn=100000+5;

int last,cur;

int nextt[maxn];//儲存節點

char s[maxn];//資料

int main()

}for(int i=nextt[0];i!=0;i=nextt[i])

printf("\n");

}return 0;

}

以這個輸入為例。

abc[de]f

首先在abc的時候,是按順序鏈結的 0->1->2->3 當遇到'['時,cur=0;所以 next[5]=next[0]; next[0]=5;這樣  順序就變成了 0->5->1->2->3; 然後到e這個字元,同樣 next[6]=next[5];next[5]=6; 這樣 順序變成了 0->5->6->1->2->3; 然後到']' 這時候 cur=last=3; 然後到了f; next[9]=next[3]; next[3]=9; 這樣 最後的順序為 0->5->6->1->2->3->9; 這也是最後的列印順序,注意 開頭的0只是個開始,對應指標表示裡的頭指標,它本身不代表任何字元 因為s[0]不代表字元,s是從1開始的有字元。當然,與鍊錶一樣 這個0可以有,沒有也行,如果不從0開頭 就需要設next[1]=0;然後,最後單獨列印s[1];

核心就是 next[i]=next[cur]相當於指標建立中的 p->next=*l->next;(乙個是讓next[i]=0,乙個是讓p->next=null) next[cur]=i 相當於指標建立中的 *l->next=p;(乙個讓cur->i 乙個讓l的next->p)

例題2:uva12657移動盒子(雙向鍊錶)

此處移動盒子,也要引起其他盒子的移動,所以考慮鍊錶,但是此處盒子的左右兩邊都要考慮,所以考慮雙向鍊錶,創立兩個鍊錶,分別儲存盒子左邊鏈和盒子右邊鏈!這個比單向鍊錶好理解多了。。

核心**:1.改變盒子節點:

void link(int l,int r)

2.

for(int i=1;i<=n;i++)

**:技巧:1.用inv=!inv來表示反轉鏈與否,若反轉了,則操作12以後就反向進行用op=3-op來表示。最後再判斷n是否是偶數,奇數的話反轉前後奇數字置的數不變,但是如果是偶數恰好是其補集。所以要最後判斷n是否是偶數。特點是此題不需要輸出改變位置後的順序,只需要輸出數字即可,因此用inv足矣!

#include #includeusing namespace std;

const int maxn=100000+10;

int lefted[maxn];

int righted[maxn];

void link(int l,int r)

int main()

righted[0]=1;

lefted[0]=n;

int op,inv=0,x,y;

while(m--)

else if(op==2)

else if(op==3)

else}}

}int b=0;

long long int ans=0;

for(int j=1;j<=n;j++)

if(n%2==0&&inv)//判斷反轉

ans=(long long int)n*(n+1)/2-ans;

printf("case %d: %lld\n",cases++,ans);

}return 0;

}

資料結構 陣列與鍊錶

陣列的特點 1.在記憶體中,陣列是一塊連續的區域 2.陣列需要預留空間,在使用前需要提前申請所佔記憶體的大小,不知道需要多大的空間,可能會浪費記憶體空間,即陣列空間利用率低 3.在陣列起始位置處,插入資料和刪除資料效率低。插入資料時,待插入位置的的元素和它後面的所有元素都需要向後搬移 刪除資料時,待...

資料結構 可變陣列 鍊錶

變長陣列 variable length array 簡稱 vla c語言中,直到c99標準出現之前,宣告陣列時在方括號內只能使用整數常量表示式。而c99做了很大改進,允許陣列的 中的值是整形變數或是整形表示式。這就解釋了下面的情況 int n scanf d n int array n 雖然n確實...

資料結構 比較鍊錶和陣列

計算機的資源是有限的 而人對計算機的需求是無限的 好的資料機構和演算法便是為了更好的滿足計算機使用者的需求 而這也是計算機作業系統意義所在。在學習資料結構的同時 了解一定的計算機作業系統知識有助於更好的理解其意義所在。而了解資料結構和演算法 會更容易明白作業系統的工作原理。廣義上講 資料結構是資料的...