DS博客做業02--線性表

1.本週學習總結

1.1思惟導圖

1.2.談談你對線性表的認識及學習體會

經過線性表的學習,對鏈表有了更進一步的認識和掌握,鏈表相比於之前的數組,它對數據的插入、刪除,方便了許多,是一種更高效的作法,不用經過挪動數組來插入、刪除,只要改變鏈鏈接的結點便可。而有序表的操做與數組相似,也是經過移動來插入、刪除數據。
上學期也學習過一點鏈表,但只是粗略的知道有鏈表這種數據結構的概念,經過此次的學習,學到了鏈表的一些基本操做,也發現了鏈表的優勢。

2.PTA實驗做業

2.1.題目1:順序表操做集

2.1.1設計思路(僞代碼)

查找函數
定義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

2.1.2代碼截圖


2.1.3本題PTA提交列表說明


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了

2.2 題目2:有序鏈表合併

2.2.1設計思路(僞代碼)

定義兩個指針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

2.2.2代碼截圖


2.2.3本題PTA提交列表說明

Q1:輸出結果錯誤
A1:題目要求合後的鏈表頭結點爲L1,因而,我直接用L1進行操做,把p,L2直接插在L1上,致使輸出結果錯誤。因而我將L1付給r指針,對r指針進行操做
Q2:如何實現合併兩個鏈表和仍保持有序性
A2:經過遍歷兩個鏈表,把較小的數那個插入r中,而後移動較小數所在鏈表和r的指針,若兩個數相同,則只插入其中一個,同時移動p、L二、r的指針,最後,若p或L2有剩餘數據,則把剩餘的所有插進r中

2.3 題目3:兩個有序序列的中位數

2.3.1設計思路(僞代碼)

主函數
    定義鏈表指針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

2.3.2代碼截圖




2.3.3本題PTA提交列表說明

Q1:作這題時仍是比較順利
A1:要尋找兩個有序序列的中位數,先把這兩個鏈表合併,而後遍歷合併後的鏈表,計算出該鏈表的元素個數,找出中位數是第幾個數,再遍歷鏈表找到中位數

三、閱讀代碼

3.1 題目

編寫一個程序,找到兩個單鏈表相交的起始節點。
以下面的兩個鏈表:

在節點 c1 開始相交。算法

3.2 解題思路

指針 pA 和 pB 分別指向鏈表 A 和鏈表 B 的頭結點,以後兩個指針分別以步幅爲 1 的速度向鏈表的尾部遍歷,當指針 pA 遍歷到鏈表 A 的尾節點時,將指針 pA 指向鏈表 B 的頭部。一樣地,當指針 pB 遍歷到鏈表 B 的尾節點時,將指針 pB 指向鏈表 A 的頭部。當兩個指針相遇時,指針 pA 或者 pB 所指向的節點就是兩個鏈表的相交節點。

3.3 代碼截圖

3.4 學習體會

該題用兩個指針相對其餘作法,下降了時間複雜度和空間複雜度,也簡化了代碼,算是最優的解題的方法。
多看題能夠開拓咱們的思惟,打破咱們的定向思惟,優化算法,找到更高效的解決方法。
相關文章
相關標籤/搜索