1. 程式人生 > >第02次作業-線性表

第02次作業-線性表

while 認識 序列 解決 void HA next blog 余數

一、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次作業-線性表