經過線性表的學習,對鏈表有了更進一步的認識和掌握,鏈表相比於之前的數組,它對數據的插入、刪除,方便了許多,是一種更高效的作法,不用經過挪動數組來插入、刪除,只要改變鏈鏈接的結點便可。而有序表的操做與數組相似,也是經過移動來插入、刪除數據。 上學期也學習過一點鏈表,但只是粗略的知道有鏈表這種數據結構的概念,經過此次的學習,學到了鏈表的一些基本操做,也發現了鏈表的優勢。
查找函數 定義i爲Data數組下標 for i=0 to L->Last+1 若是找到數據X 返回i end for 返回ERROR 插入函數 定義Data數組下標i if 未插入數據時,順序表裏數據個數已經等於MAXSIZE-1 輸出FULL 返回false end if else if 插入位置在第一個數前面或在最後一個數的後面的後面位置 輸出ILLEGAL POSITION 返回false end if else for i=L->Last+1 to i>=P 把前一個數據放到i這個位置 end for 把X賦值給L->Data[P] L->Last++; 返回true end if 刪除函數 定義Data數組下標i if 要刪除數的位置不在順序表範圍內 輸出POSITION P EMPTY 返回false end if else for i=P to L->Last 把第i+1個數往前移 end for L->Last-- 返回true end if
Q1:一開始題目較長,函數又比較多,題目意思不是很理解,Devc上代碼寫好後,測試時輸出結果與題目不一樣 A1:第一個函數要求建立並返回一個空的線性表,我一開始是L->last=0,但輸出結果老是錯的,後來看了網上一些代碼,發現L->last=-1纔是。若L->last置爲0,則插入5個數,實際只有4個數被插進去 Q2:輸出結果和題目的同樣後,開始提交,一直是答案錯誤 A2:緣由是我動態申請時,寫的是L=(List)malloc(sizeof(struct List)),改爲L=(List)malloc(sizeof(struct LNode))就OK了
定義兩個指針p,r 把L1->next賦給p 把L1保存在r中 把r後面的關係斷掉 while p&&L2 if p->data<L2->data p結點插入r後面 p指針日後移 r指針日後移 end if else if p->data>L2->data L2結點插入r後面 L2指針日後移 r指針日後移 end if else p結點插入r後面 p指針日後移 L2指針日後移 r指針日後移 end if while p p中剩餘部分插入r中 end while while L2 L2中剩餘部分插入r中 end while r->next=NULL end while
Q1:輸出結果錯誤 A1:題目要求合後的鏈表頭結點爲L1,因而,我直接用L1進行操做,把p,L2直接插在L1上,致使輸出結果錯誤。因而我將L1付給r指針,對r指針進行操做 Q2:如何實現合併兩個鏈表和仍保持有序性 A2:經過遍歷兩個鏈表,把較小的數那個插入r中,而後移動較小數所在鏈表和r的指針,若兩個數相同,則只插入其中一個,同時移動p、L二、r的指針,最後,若p或L2有剩餘數據,則把剩餘的所有插進r中
主函數 定義鏈表指針L1,L2 定義n 輸入n 函數調用 尾插法建鏈表函數 定義鏈表指針s,r 定義i 給L動態申請空間 L賦給r for i=0 to i<n 給s動態申請空間 輸入s->data 把s插到r後面 end for r->next=NULL 合併鏈表函數 定義兩個指針p,r 把L1->next賦給p 把L1保存在r中 把r後面的關係斷掉 if p->data<L2->data p結點插入r後面 p指針日後移 r指針日後移 end if else if p->data>=L2->data L2結點插入r後面 L2指針日後移 r指針日後移 end if while p p中剩餘部分插入r中 end while while L2 L2中剩餘部分插入r中 end while r->next=NULL; 找鏈表的中間數函數 定義指針p 定義n=0,i=0,j p=L->next; L=L->next; while(p) n++ p指針後移 end while j=(n+1)/2 //中位數 while(L) i++ if i==j 輸出中位數 end if L指針後移 end while
Q1:作這題時仍是比較順利 A1:要尋找兩個有序序列的中位數,先把這兩個鏈表合併,而後遍歷合併後的鏈表,計算出該鏈表的元素個數,找出中位數是第幾個數,再遍歷鏈表找到中位數
編寫一個程序,找到兩個單鏈表相交的起始節點。
以下面的兩個鏈表:
在節點 c1 開始相交。算法
指針 pA 和 pB 分別指向鏈表 A 和鏈表 B 的頭結點,以後兩個指針分別以步幅爲 1 的速度向鏈表的尾部遍歷,當指針 pA 遍歷到鏈表 A 的尾節點時,將指針 pA 指向鏈表 B 的頭部。一樣地,當指針 pB 遍歷到鏈表 B 的尾節點時,將指針 pB 指向鏈表 A 的頭部。當兩個指針相遇時,指針 pA 或者 pB 所指向的節點就是兩個鏈表的相交節點。
該題用兩個指針相對其餘作法,下降了時間複雜度和空間複雜度,也簡化了代碼,算是最優的解題的方法。 多看題能夠開拓咱們的思惟,打破咱們的定向思惟,優化算法,找到更高效的解決方法。