DS02--線性表


一、PTA實驗作業

題目1:線性表元素的區間刪除

給定一個順序存儲的線性表,請設計一個函數刪除所有值大於min而且小於max的元素。刪除后表中剩余元素保持順序存儲,並且相對位置不能改變。

1. 設計思路

定義整型變量統計變量n,循環變量i	
if (最小值大於等於最大值) 
	return L
for( i=0 to 鏈表最后)
	if ( L->Data[i]滿足條件 )
		統計變量n++
	否則 L->Data[i-n]=L->Data[i] 剔除不合題意的值
i++ end
L->Last-=n改變鏈表最后位置

2.代碼截圖

3.PTA提交列表說明

4.調試問題

- 思路錯誤:最初始參考課堂派的一道題來做的,后來發現不用那么麻煩,一層循環就可以

題目2:判斷鏈表結點對稱

設計算法,判斷帶頭結點的循環雙向鏈表中的數據結點是否對稱。 如果對稱,輸出“yes” 如果不對稱,輸出“no” 鏈表空則輸出“NULL”

1.設計思路

------------初始化函數-------------

創建頭節點L
L的前后指向自己,構成循環鏈表

銷毀函數

定義L及其下一個節點的代理工作結構體指針s,p
while (p指針沒指到頭結點L)
	delete pre刪除前一節點
	pre = p;同時向后移
 	p = p->next;
end p==L循環結束
delete pre 刪除最后節點

--------------輸出函數---------------

定義L下一個節點的代理工作結構體指針s
若L為空 輸出NULL
while(s指針沒指到頭結點L)
	輸出s->data 
	指針后移
end s==L
換行

---------------插入函數--------------

定義計數變量j=0
定義L的代理工作結構體指針p,帶插入節點指針s

while(前i-1個節點且不為空)尋找插入位置
	p向后移
	j計數++
end j==i-1找到第i-1個元素

s申請空間並給數據域賦值
s->next = p->next  在p后插入s新節點
s->prior = p  雙向
p->next->prior = s
p->next = s


--------------判斷對稱函數-------------

定義L前后節點的代理工作結構體指針s,r
while (s不等於r)
	若  s數據域不等於r數據域  不對稱
	return 0
	否則  繼續循環鏈表
	s,r分別向前后移動遍歷鏈表
end 鏈表遍歷結束
return 1 成功循環則對稱 

2.代碼截圖

3.PTA提交列表說明

4.調試問題

  • 4.1 編譯錯誤:沒有加c++頭文件

  • 4.2 運行超時:銷毀函數錯誤

調試過程:

最初在dev運行時答案正確但會停止工作

所以我先把判斷是否對稱函數注釋掉,發現在輸出鏈表后就會停止工作

最后檢查出是銷毀函數的條件錯誤,因為是雙向鏈表,所以在循環到頭結點L時就停止銷毀,而我慣性思維將條件寫成不為空

  • 4.3 部分正確:空表輸出NULL

題目3:順序表刪除重復元素

設計一個算法,從順序表中刪除重復的元素,並使剩余元素間的相對次序保存不變。

1. 設計思路

-----------------創建函數----------------

定義循環變量i
若 節點個數n為0  exit 0
為L申請存放空間
for(i=0 to n)
	L數據域賦值
end 數據存放結束
鏈表長度=n

------------------輸出函數-----------------

定義循環變量i
for(i=0 to 長度-1)
	輸出數據加空格
end 輸出n-1個數據
輸出最后一個數據不加空格


---------------刪除重復元素函數--------------

定義循環變量i=0,j=1,記錄變量len=1
while (j小於長度)遍歷鏈表
	for(i=0 to len)
		若 有重復元素
		break 跳出
	若 i==len 
	剩余元素加入
	否則  j++
end 

2.代碼截圖

3.PTA提交列表說明

4.調試問題

部分正確:重復元素,只判斷了前后元素是否重復。

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

1.順序表PTA排名

2.鏈表PTA排名

3.我的總分:2.5分

三、本周學習總結

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

這周的話,幾乎都在PTA上磨時間,有收獲也有失落,可能還沒能將鏈表理解透徹,並不能在題目中較好的使用鏈表。每道題都是極大的挑戰。碰到做不出的操作,我會先百度看完思路后,再自己動手打出來,模仿也是種學習。當自己打完后還有不會的地方,這時會自己思考。我認為這種學習方式很適合自己,會堅持下去。

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

2.1順序表:連續的內存划分及數據存儲

  • 性質:

①隨機訪問(查找快,直接定位)
②存儲密度高,只存儲數據元素
③插入、刪除操作需要大量移動元素

  • 插入:

①時間復雜度:O(n)
②空間復雜度:O(1)

  • 刪除:

①時間復雜度:O(n)
②空間復雜度:O(1)

2.2單鏈表:非連續的內存划分

  • 性質:

①逐個遍歷(查找慢)
②存儲密度相對低,存放指針域
③插入、刪除操作快

2.3雙鏈表

在單鏈表的基礎上,結構體增加一個指向前驅結點的prior的指針

2.4循環單鏈表

在單鏈表的基礎上,在表尾的next指向表頭 r->next = L

2.5循環雙鏈表

在循環單鏈表基礎上,結構體增加一個指向前驅結點的prior的指針,加上L->prior = r;r->next = L

3.代碼Git提交記錄截圖

四、閱讀代碼

題目:重排鏈表

void reorderList(ListNode head)
 { 
        if(head == null || head.next == null)
            return;
        ListNode p = head;
        ListNode q = head.next;
        while(q != null && q.next != null)
        {
            p = p.next;
            q = q.next.next;
        }
        //中間節點
        q = p.next;  
        p.next = null;
        //將后半段逆序
        ListNode rHead = null;  
        while(q != null)  
        {  
            ListNode r = q.next;  
            q.next = rHead;  
            rHead = q;  
            q = r;  
        }
        //向前半段插入
        q = rHead;  
        p = head;  
        while(p != null && q != null)  
        {  
            ListNode rr = q.next;  
            ListNode lr = p.next;  
            q.next = lr;  
            p.next = q;  

            q = rr;  
            p = lr;  
        }
}

分析:這道題很有意思,第一眼看上去很復雜,其實只要先找到鏈表的中間節點,然后將后半部分提出來,把后半部分反轉,然后將前半部分與反轉了的后半部分交叉合並起來。這段代碼是從網上找的,只貼出了最核心的一部分。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM