線性表簡稱表,是n個元素的有限序列。
特點為每個元素僅有乙個前驅和後繼,第乙個元素無前驅,最後乙個元素無後繼,並且所有的元素的元素型別相同。
線性表跟其他的邏輯結構的資料一樣,儲存結構分為順序儲存和鏈式儲存。
順序儲存的表稱作順序表,鏈式儲存的表稱作鍊錶。
順序錶用結構體內的陣列模擬,用乙個int型別的變數儲存順序表的長度。
順序表的建構函式分為有參及無參兩種。
無參的建構函式只需初始化表的長度為0,即可代表這個表是空表。
有參的建構函式就不能構造為空表,而是根據傳遞進來的陣列乙個個賦值(莫忘長度的賦值,以及若是傳進來的表的長度長於線性表的長度,就丟擲異常)。
其他的操作都比較簡單,就是簡簡單單的陣列操作即可。
查詢操作中:
特別注意順序表的按位置查詢的操作。若是順序表是從0開始儲存,那麼查詢的位置i就對應的不是順序表中的a[i],而是a[i-1]。(注意所求位置小於0或者大於鍊錶長度的情況)。
若是按值查詢,返回位置,則需要注意返回的位置需要是i+1。
插入或者刪除操作中:
在插入或者刪除元素時,特別注意元素移動的順序!
若是插入元素到i位置,所有i~n的元素都需要後移,此時的後移為了保持後面元素的完整性,不能從前往後移動,而是從最後乙個元素開始移動,逐步後移(時耗巨大),刪除元素前移,則是從前往後移動。
單鏈表是通過隨意的幾個儲存單元儲存資訊的。
單鏈表的每乙個點都由結構體構成,裡面包含著這個點要儲存的數值跟指向下乙個區域的指標。
單鏈表的建立需要乙個頭指標和乙個頭節點,都是為了以後建構函式等操作的使用方便,保證操作的可複製性,那樣的話一樣的操作就是一樣的**,不用分好幾個情況了。
鍊錶基本的操作有:
(1)建構函式(分為有參的建構函式和無參的建構函式),帶參的建構函式又分為頭插法和尾插法兩種。
一樣的是,所有的建構函式都需要先對頭指標(也就是first進行構建:分配空間變成頭節點與指向下乙個元素(大多數情況下例如單鏈表,都指向空,特殊情況下如迴圈鍊錶需要再指向first)
不同的是,不帶參的建構函式的構造到此為止,而帶參的建構函式還需要借助陣列進行賦值等操作。
其中,頭插法是申請乙個節點然後將它插到頭節點之後,最核心的操作為:
s->next=first->next;
first->next=s;
尾插法插入的位置是最後乙個節點之後,所以需要乙個尾指標來標記最後乙個位置,以便於o(1)的插入尾部。核心操作為:
r->next=s;
r=s;
(2)遍歷輸出
遍歷輸出時,因為頭節點沒有值,所以可以用p=first->next作為第乙個輸出的節點,直到p為空才不輸出。
(3)按位刪除
在刪除時,需要注意的是要是刪除那個元素a,則a之前的位置也需要知道(因為a之前位置的指標需要變化,指向的不再是a,而是a->next),但是難點也就這一點點,很簡單。
為了解決這一問題,我們可以有兩種解決方法。
①構造另乙個指標,用於刪除的指標為q,記錄的是當前的位置,用於記錄前乙個節點是誰的為p,記錄的是前乙個節點的位置。每次q移動時,先將q的位置賦值給p,在讓q賦值為q->next。
②檢查的位置為i-1的位置,在到達i-1位置時,直接將p->next=p->next->next,就可以跳過下乙個位置,達到刪除的操作。
(4)按值刪除
遍歷,然後找到數字,然後跟按位刪除一樣的操作(我還是用的兩個指標),這裡用找位置的第二個方法就不好用了。
(5)插入
鎖定插入的位置|。^ ^)
然後跟節點的構造乙個操作的修改方法。
說實話,指標一直是我們所不熟悉的一塊領域,在此之前,我用過最深的指標就是刻意的練習指標的用法並且取內容操作,再就是用的stl裡面的迭代器,即使是迭代器也比指標熟悉。
可能是因為迭代器跟指標的相似性,在學習這裡的時候,我十分的明白->的作用到底是什麼,但是對指標的某些內容還是不是很清楚。
比如說,頭節點的形成。直到現在,我對頭節點的個人理解止步於利用頭指標在頭指標的地盤上申請了乙個點型別的空間,裡面也有乙個next來指向下乙個節點(自然為空)。頭指標和頭節點在我的認知範圍內是很融洽的融合在一起的,我做題目的時候也是利用的這個想法。
可是老師所說的顯然跟我不一樣,在他看來,頭指標跟頭節點彷彿是。兩個東西,頭指標指向乙個頭節點,頭節點不儲存任何資料,裡面的指標指向下乙個記憶體區域。
我對此很是迷茫,不知道該怎麼思考才能更好的理解頭指標與頭節點,只能暫且將我的想法貫徹下去。
其次,對於first以及first->next的取用我也十分的分不清楚。
課本上有時候直接給指標賦值為first,有時候則是賦值為first->next,我清楚的明白first不儲存任何資料(可是在迴圈鍊錶裡面我還是儲存進去東西了,因為那個約瑟夫環狀的特殊構造,不儲存資料進去我實在不知道該怎麼解決我的問題),也知道first->next才是第乙個儲存資料的節點,可是每次用都要糾結好久好久
與他類似的是指標直到p->next!=nullptr為迴圈截至的條件還是以p!=nullptr為迴圈截止的條件,哎糾結啊糾結。
我的解決方法就是一次次的測試,看看哪一次能夠成功,所以了解一直不是很深刻,即使某一次用對了也不自知。
資料結構的題目還沒有做完!我要繼續加油!大佬太多了,後面的題目給我一種很模糊的感覺(明明用set或者別的操作就能完成的題目非要用鍊錶真的很難受。
但是我明白鍊錶的操作是必須的,資料結構是一門很重要的課程,所有的操作我必須直到的一清二楚,所以即使是我很不情願,可是我也會很情願的努力用鍊錶做完所有的操作。
繼續加油!一定要學會學好這門基礎課程!
資料結構(線性表)
1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...
資料結構 線性表
參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...
資料結構 線性表
線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。按其邏輯儲存方式的不同可分為兩類線性表 順序表和鏈式表。其中鏈式表又可分為線性鍊錶 迴圈鍊錶和雙向鍊錶。下面分別介紹下這幾種線性表的資料結構 1.順序表 typedef struct sqlist 插入演算法 i到n...