第02次作業-線性表
一、PTA實驗作業
題目一:6-3 jmu-ds- 順序表刪除重復元素
1.題目要求
2.設計思路
(1)創建順序表 創建順序表L,並置其長度為零。 將主函數傳遞過來的數組依次放入順序表(定義i控制元素的寫入),並將順序表長度置為數長度 (2)瀏覽順序表 定義i控制輸出,當i<順序表長度時輸出,大於時結束輸出。 (3)刪除重復元素 定義i,j,k控制循環
for(i=0;i<L->length-1;i++)
{
找到與下標為i的元素data域相同的元素
for(j=i+1;j<L->length;j++)
if(L->data[i]==L->data[j])
{
將重復元素後的元素向前移一位
for(k=j;k<L->length-1;k++)
L->data[k]=L->data[k+1];
L->length--;
}
}
當L的長度為2且兩元素的data相同時,順序表的長度減一
if(L->length==2&&L->data[0]==L->data[1]){
L->length--;
}
3.代碼截圖
4.pta提交列表說明
錯誤點:全部重復數據時,結果應只有一個數字,而我未修改前有兩個。
修改前: 修改後:
修改方法:在刪除重復元素的函數中,加入一個條件語句,當順序表長度為2且兩個元素data相同時,順序表長度減一。
題目二:7-1 兩個有序鏈表序列的合並
1.題目要求
2.設計思路
創建、瀏覽、銷毀函數都比較常規,不做說明。
void Union(LinkList *&ha,LinkList *&hb,LinkList *&hc) {
LinkList*pa=ha->next,*pb=hb->next,*r,*s,*q; hc=new LNode; r=hc;
當pa且pb都不為空時,進行循環 while(pa!=NULL&&pb!=NULL) {
pa的data小於pb的data時創建新結點存放pa的data if(pa->data<pb->data) { s=new LNode; s->data=pa->data; r->next=s; r=s; pa=pa->next; }
否則創建新節點存放pb的data else { s=new LNode; s->data=pb->data; r->next=s; r=s; pb=pb->next; } }
pa或pb其中一個為空時上述循環結束,進入以下循環。
將pa或pb中剩余數據放入新鏈表。 while(pa!=NULL) { s=new LNode; s->data=pa->data; r->next=s; r=s; pa=pa->next; } while(pb!=NULL) { s=new LNode; s->data=pb->data; r->next=s; r=s; pb=pb->next; }
將新鏈表的next域置空 r->next=NULL; }
3.代碼截圖
4.pta提交列表說明
錯誤點一:鏈表為空時段錯誤。
修改方法:在主函數中加入一條判斷語句。在建立了鏈表ha和hb後,直接判斷ha與hb是否為空,若為空,則輸出NULL。
錯誤點二:大規模輸入時運行超時。
修改方法:我先找到了運行超時的原因。我原本是先將兩鏈表合並後再排序再輸出,但此題鏈表本身有序,我的這種算法應該比較適合本身無序的鏈表。後來新寫了一個合並函數,將ha與hb中的元素比較大小後將較小的元素寫入hc就不會超時了。
題目三:6-2 jmu-ds-單鏈表逆置
1.題目要求
2.設計思路
(1)用尾插法存入數據,以保證數據按輸入順序存儲。代碼與課本相同,不做說明。 (2)用頭插法將已創建的鏈表得到數據重新存入新鏈表 void ReverseList(List &L) { ListNode *p; ListNode *q; p=new node; p->next=NULL; 頭插法存入數據 while(L->next!=NULL){ q=new node; L=L->next; q->data=L->data; q->next=p->next; p->next=q; } 令原鏈表L等於新鏈表 L=p;
3.代碼截圖
4.pta提交列表說明
錯誤點一:鏈表為空時段錯誤。
修改方法:一開始我是在CreateList函數中加入了條件語句,若輸入的n為零就輸出NULL,但修改後發現此錯誤仍然存在,不論在CreateList函數中是否輸出了NULL,主函數都要接著運行,此時運行碰到PrintList函數時由於缺少對於鏈表為空情況的判斷,出現了段錯誤,所以最後在PrintList函數中加入了判斷鏈表是否為空的條件語句又刪除了CreateList函數的判斷結果就正確了。
二、本周PTA題目集排名
1.順序表PTA排名
2.鏈表PTA排名
3.我的總分
2分
三、本周學習總結
1.談談你本周數據結構學習時間是如何安排,對自己安排滿意麽,若不滿意,打算做什麽改變?
1)學習時間:在上課前花1~2小時做預習工作,對於上課老師講的有疑惑的地方課後花時間解釋解決。其余學習時間主要是在編程時對於疑惑的地方再翻書或詢問同學。2)編程時間:沒課的時候基本都在打pta。3)對於不懂的問題主要是詢問同學或自行百度。
2.我對線性表的認識
線性表的存儲結構主要分為兩種:順序表和鏈式存儲。對於元素的插入與刪除,用順序表做會比較麻煩,用鏈表則比較方便快捷。
3.Git提交記錄截圖
第02次作業-線性表