博客作業02---線性表


一、PTA實驗作業

題目1:7-1 最長連續遞增子序列

給定一個順序存儲的線性表,請設計一個算法查找該線性表中最長的連續遞增子序列。
例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)

1. 設計思路(偽代碼或流程圖)

/*查找最長連續遞增子序列函數 */
  定義整型變量i,j表示循環變量,k用來作找到后新數組下標
  定義整型變量 MaxLength=1; //MaxLength為1, 表示長度只有頭部
  定義整型 a[maxsize]存放最長連續遞增子序列
  for i=0 to L->length
    a[i]=1;   //表示長度只有頭部 
     for i=0 to L->length-1
        for i=0 to L->length-1
            如果 前一個元素 > 后一個元素
            a[i]++
            否則 break      
    找到后:  
    for i=0 to L->length
        如果 a[i] > MaxLength,k=i
    如果 長度為1,直接輸出此數
    如果 長度為0,return
    輸出最后結果 
  end for

2.代碼截圖


3.PTA提交列表說明

  • 編譯錯誤。把PTA中的C改成C++后提交;
  • 部分正確。沒有考慮只有一個數時的情況,需要再加上if(MaxLength==1)時,直接輸出這個數;

題目2:6-2 jmu-ds-單鏈表逆置

本題要求實現一個函數,將給定單向鏈表逆置,即表頭置為表尾,表尾置為表頭。鏈表為帶頭結點鏈表。
(單鏈表基本操作根據老師發的變化。)

1. 設計思路(偽代碼或流程圖)

/*逆置函數void ReverseList(List &L)調用 */
    如果鏈表L 為空表||只有有一個元素 
           輸出 NULL,不逆置
    定義指針p,q ListNode *p,*q移動
    令p指向L的第二個數據
    while(p)
        q 保存下p的值 ,p移動 
        p的next指向前一個元素
        L->next的值不斷變化,循環
    end for 

2.代碼截圖


3.PTA提交列表說明

  • 需要考慮空表或僅僅只有有個元素時,不需要逆置;
  • 答案錯誤。輸入1 2 3 4 5逆置后輸出4 3 2 1,修改第一個輸出所指結點輸出;
  • 部分正確。猜想是逆置函數出錯,注釋掉其他函數,再讀代碼,查找出錯地方,修改:在建模輸入值時循環條件出錯,將for(i=1;i<n;i++)改為for(i=1;i<=n;i++);
  • 格式錯誤。輸出函數,最后一個無空格;

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

1. 設計思路(偽代碼或流程圖)

先類似7-1將給出的兩個鏈表S1,S2合並,用鏈表S3裝好
/*查找中位數int Find(LinkList S3, int m,int n)調用*/ 
    m為中位數下標 
    定義整型變量j=0 表示S3下標
    定義整型變量length=2*n表示合並后S3長度 
    定義 LinkList p=S3方便進行移動
    如果 p為空 return 0
    當 j<=m 時
         j遞增
         p移動
    直到j==m找到
    返回找到的下標所指的值
    end for

2.代碼截圖



3.PTA提交列表說明

  • 編譯錯誤。忘記把PTA中的C改成C++后提交;
  • 段錯誤。之前把合並后的S3先輸出來,函數沒注釋掉,不用輸出,直接輸出中位數的值;
  • 答案錯誤。中位數查出錯誤,函數出錯,檢查發現length長度在合並后沒有及時改變,應該變成2n;

二、截圖本周題目集的PTA最后排名

1.順序表PTA排名

2.鏈表PTA排名

3.我的總分:215

三、本周學習總結

1.談談你本周數據結構學習時間是如何安排,對自己安排滿意么,若不滿意,打算做什么改變?

  • 課前完成老師布置的預習作業,然后平時上數據結構課程,課后完成相應的PTA練習題;
  • 不太滿意。除了老師安排的固定學習外可以自己課下多看數據結構書,看看代碼和解題思路;
  • 編程上不懂的地方先上網自己嘗試弄懂,如果不行,請教同學;

2.談談你對線性表的認識?

主觀認識:線性表是一種數據結構,能表示出前后相同元素之間的關系,讓元素有規律的排列或組合;
本章小結:
(1)線性表的定義。線性表是具有相同特性的數據元素的一個有限序列;
(2)線性表的抽象數據類型描述。 
ADT List {
  數據對象:D={ | ∈ ElemSet, i=1,2,...,n, n≥0 }
數據關系:R1={ <ai-1 ,ai >| ,∈D, i=2,...,n }
基本操作:
   { 結構初始化 InitList( &L ) }  
    操作結果:構造一個空的線性表 L
{ 銷毀結構 DestroyList( &L ) }
  }
(3)線性表的順序存儲結構---順序表及其運用。
包括順序表的建立、初始化線性表、銷毀線性表、判斷是否為空表、求線性表長度、輸出線性表,
還有在線性表中進行某些基本操作運算:如: 求線性表中某個數據元素值、按元素值查找 、插入元素值、 刪除元素值;
(4)線性表的鏈式存儲結構---鏈表,分有單鏈表、雙鏈表和循環鏈表及其運用。
單鏈表中,每個節點有一個指針域,指向其后繼節點,進行操作 時,除了對該節點操作外,還需要考慮其前后的節點;
單鏈表也有順序表里面的基本操作:刪除、插入、建表(頭插法或尾插法,頭插法會逆序輸出)、初始化、銷毀等;
雙鏈表中,每個節點有兩個指針域,一個指向其后繼節點,另一個指向其前驅節點;
建立雙鏈表也有兩種方法:頭插法或尾插法,基本操作跟單鏈表同;
插入節點(如:s插入p后):
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
刪除節點(如:刪除p后的節點,得修改兩個指針域):
p->next=q->next;
q->next->prior=p;
(5)循環鏈表,是另一種形式的鏈式存儲結構。
特點:表中尾節點的指針域不再是空,而是指向頭節點,整個鏈表形成一個環,因此,從表中任一個節點出發均可找到鏈表中其他節點;
基本運算:與非循環鏈表基本相同,只對表尾的判斷作了改變,例如,在循環單鏈表或循環雙鏈表L中,判斷表尾節點p的條件是p->next==L;
(6)有序表,指其中所有元素以遞增或遞減方式有序排列的線性表。
有序表的存儲結構及其基本運算:
若以順序表存儲,除插入函數外其余運算基本相同,掃描L,找到插入位置 i,將data[ i ]及后面元素后移一個位置,插入元素e;
若以單鏈表存儲,除插入函數外其余運算基本相同,查找前驅節點
pre,創建放e的數據節點p,在pre后插入*p節點;
有序表的歸並。將兩個有序表合並成一個有序表---二路歸並法。
二路歸並法:
分別掃描LA和LB兩個有序表,兩個均未掃描完時,比較LA和LB當前元素,較小的放入LC中,再從較小元素所在的有序表中取下一個元素,重復此過程直到 LA或LB比較完畢,最后將沒有比較完的有序表中余下的元素放入LC中;

3.代碼Git提交記錄截圖


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com