寒假自學資料結構打卡 Day1 單鏈表

2021-10-17 15:08:17 字數 2289 閱讀 7209

​ 眾所周知,南京某頂著985,211,雙一流名頭的三本大學的放假時間是極晚的,若不是學生鬧一鬧,恐怕得到二月份才放假。上學期的c++課我雖然考了100,但越學越覺得力不從心。所以抽出來寒假來學一下資料結構。

​ 資料結構書配合網課雖然易於理解,但使用的畢竟是類c語言而且還不完整,所以用c++來實操一下就特別有必要了。

struct listnode

//建構函式

};

​ 鍊錶就是用鍊子把一連串節點給串起來,節點中存有資料與指向下乙個節點的指標,用結構體來實現再合適不過了。(雖然我們c++課學的是類,不過類還是要用public之類的語句,我覺得不如結構體簡便)

listnode* head=null;
​ 這裡我建立了頭節點,它不儲存資料,但是整個鍊錶的開始。

listnode* first=new listnode(1);

head->next=first;

​ 這裡我建立了首元節點,並存入了資料1,然後把頭節點的next指向了首元,這樣就基本串了起來。

status getelem(linklist l,int i,elemtype &e)

if(!p||j>1)return 0;

e=p->data;

return 1;

}

這是類c語言描述出來的函式,用e來承接返回來的資料。這個函式還是比較簡單的,把它轉換為c++語言很容易。

查詢的演算法與取值類似,不同之處在於查詢到後返回的是位址。不過我感覺這種方法還是有缺陷的,它只能返回查詢到的首個資料位址,如果之後還有的話那就查不到了。我認為可以給它改一下,用陣列指標來承接每個元素。

插入來說相對難實現一些。假如我們要在第二和第三個節點之間插入乙個節點a,應該如何實現呢?

一開始我們要插入的節點其next為nullptr,只存有資料

第一步,讓a節點的next指向三,**為

a->next=second->next;
第二步,讓第二個節點的next指向a

second->next=a;
這兩步是不能互換的,一換就會出問題。

於是,其完整的演算法為

status listinsert(listnode &l,int i,elemtype e)

if(!p||j>i-1)return error;

s=new lnode(e);

s->next=p->next;

p->next=s;

return ok;

}

展示一下我寫的乙個很簡單的c++**

int insert(listnode* head,int e,int i)

listnode* s;

s=new listnode(e);

s->next=p->next;

p->next=s;

return 1;

}

這段**基本上實現了簡單的插入,當然其健壯性不高。

刪除單鏈表中的乙個節點,我們僅需讓該節點的前驅指向該節點的後繼,然後再把該節點的next改為nullptr。但這樣操作後節點所佔記憶體還是存在的,我們要想辦法把它給釋放掉。我們一般把要刪除的節點的位址儲存在乙個臨時的q中,然後c++中通常用delete刪除。這個演算法個人感覺比較簡單,因此不再贅述。

前面研究這些操作時我建立了first,second等結構體指標來作為節點。但這樣子不僅效率不高而且與順序表沒有本質區別,因此必須尋求一種高效的方法。

void createlist_h(linklist &l,int n)

}

​ 這個演算法還是容易理解的,我們要在l後插入n個節點,每次都要建立乙個新的節點,讓它的next變為l的next(即上乙個p的next),然後讓l的next變為這個p。

​ 這個可以這麼理解,在初始的l後面還存在著乙個null節點,每次操作都相當於在null和null之前的節點之間插入乙個節點。

​ 前插法中資料的順序並不是按照輸入順序來的

後插法資料的順序就是按照輸入順序來的了。

l=new lnode;

l->next=null;

r=l;

for(int i=0;i>p->data;

p->next=null;r->next=p;

r=p;

}

不同的是後插法需要輔助節點,該輔助節點始終指向鍊錶的最後乙個元素

資料結構 day1

資料結構往往跟演算法有很大關係 ep1 圖書館 ep2 遞迴函式很有可能導致記憶體溢位 因為每一次遞迴都在記憶體裡新建了乙個 程式 如果遞迴次數過多,那麼這個程式占用的空間會很恐怖 ep3 多項式 正常演算法和秦九韶演算法的比較。秦九韶演算法有效的減少了乘法的量級 clock 獲得從程式開始到呼叫這...

寒假自學資料結構打卡 Day4 佇列

1.離線列印輸出 2.多使用者分時使用cpu和記憶體 3.實時控制系統,訊號按接受的優先順序處理 initquene q 構造空佇列q destroyquene q 銷毀佇列 clear q 清空佇列 length q 返回佇列長度 gethead q.e 返回隊頭 enquene q,e 把e插入...

資料結構day1 棧

1.什麼是棧 後進先出 lifo 的線性表,僅能在一邊進出。2.實現方式有 順序棧和鏈式棧 順序棧的實現 將陣列的尾部當作棧頂,在棧頂尾部進行pop和push操作只需要常數時間。順序棧的實現 public class astack implements stackadt astack void in...