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