DS博客作業02--線性表


1.本周學習總結


1.1思維導圖


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

  • 線性表主要分為順序存儲結構鏈式存儲結構兩種。其中順序存儲結構主要運用的是我們比較熟悉的數組的寫法,而鏈式存儲結構則運用的是后來學的鏈表。在建表前,二者都需要對結構體先做定義。隨着學習的深入,調試的難度較之前也會大一些,沒辦法第一時間找到問題所在。經過pta的練習,能夠對一些常出現的問題進行總結:如指針域未置空申請空間失敗,甚至是結構體名稱上出現問題(這個問題比較弱智,一般都是手滑按錯了)。本周的學習,pta上的題目是基於課本的分模塊訓練,對於插入刪除查找進行了一定的函數訓練,故而做到后面的編程題時,其實主要就是將前面的函數靈活結合運用。一開始寫pta還是脫離不了課本,但是后期該現象出現好轉,練熟分塊的函數,在編寫完整的程序時也會更得心應手一些。最大的體會是,對於程序當中每一句語句的意思都要自己捋清楚,強行硬套就像背題,脫離模板就會出錯。

2.PTA實驗作業

2.1.題目1:6-4 順序表操作集

2.1.1設計思路(偽代碼)

    List MakeEmpty()
    {
    	    定義 L;
	    動態申請內存;
	    置空返回; 
    }
    bool Insert(List L, ElementType X, Position P)
    {
	    定義 i;				
	    if   表滿||位置不合法
		    cout<< "FULL"||"ILLEGAL POSITION" ;
		    return false;
	    end if
	    for L->Last + 1 to P						//倒序后移
		    L->Data[i] = L->Data[i-1];
	    end for;
	    L->Data[i] = X;						 		//插入 
	    L->Last++;		
    }
    Position Find(List L, ElementType X)
    {
    	    定義i;
	    for i=0 to L->Last
		    找到直接返回位置
	    end for  
    }
    bool Delete(List L, Position P)
    {
	    判斷位置是否合法
	    定義 i;
	    for i=P to L->Last
    } 

2.1.2代碼截圖


2.1.3本題PTA提交列表說明。

1.編譯錯誤

  • 不小心丟進去了c++的語法,然后發現只能用c來着

2.返回空表

  • 置為空表時應該使L->last=-1

3.插入數據時,答案錯誤

  • 要掌握好臨界值,確定初始化的L->last值,更改相應的變量(因為一開始寫的時候,是令L->last=0,后面改的時候就有漏改的情況)

4.答案錯誤

  • 題目設置要求,在判斷條件的順序上面,經過幾次調試,輸出的答案會不太一樣,按照題目要求調整就可以啦

2.2 題目2 6-8 jmu-ds-鏈表倒數第m個數(單鏈表)

2.2.1設計思路(偽代碼)

way1

	int Find(LinkList L, int m)
	{
		定義 nodeNum;						//節點數
		定義 p;
		p = L;								//p來動
		while p = p->next != NULL
			計數
		end while;
		if 位置!合法 return -1; end if
		for i = 0 to nodeNum - m + 1		//L動
			L移動
		end for
		return data;
	}

way2

    	int Find(LinkList L, int m)
	{
		定義 i=1;
		定義 p=L;
		while p = p->next !NULL			//鏈沒結束
			跳過 m - 1 次;
			then L 移動;
			i++;						//計數
		end while;
		if m 不合法 return -1;
		返回 data	
	}

2.2.2代碼截圖

way 1

way 2

2.2.3本題PTA提交列表說明。

  1. 位置無效 段錯誤,答案錯誤
  • 要增加一條位置判斷語句
            if (m<1 || m>nodeNum)return -1;				//非法返回

2.3 題目3 7-2 一元多項式的乘法與加法運算

2.3.1設計思路(偽代碼)

  • 主要介紹倆函數

1.PlusResult

        LinkList PlusResult(LinkList L1, LinkList L2)
		定義 p1=L1->next, p2=L2->next, p3, temp, LPLus;
		動態分配 LPlus並置空
		p3 = LPlus;									//保留頭節點
		if !p1 相加為 p2; end if
			反之 為p1;
		while p1 &&p2
			compare with indexes
			if != 將較大的存入p3並后移
			else factor相加后存入
			end if
		end while
		剩余鏈接上;

2.MultResult

        void MultResult(LinkList L1, LinkList L2, LinkList &LMult)
		定義 p1=L->next, p2=L->next, p, temp;
		while p1
			新生成head並置空					//p2的函數是為了生成一個新的鏈表,然后用於加法函數,所以這個head每次都要新生成一下 
			p = head;
			while p2
				新生成temp並置空
				factor 相乘 index相加
				存入后移;
			end while
			p->next=NULL
			LMult = PlusResult(head, LMult);	//調用加法函數
			初始化結點
	        end while

2.3.2代碼截圖

1.調用加法函數





2.3.3本題PTA提交列表說明

  • Q:一開始寫加法函數,用了三個參數,在乘法當中調用函數則用了一個鬼畜的寫法,大概是這樣:PlusResult(L1,LMult,LMult);,程序出錯,乘法無法運行。
  • A:是一種比較鬼畜的嘗試,經過這個之后中規中矩改寫了PlusResult函數,把函數類型改成LinkList,就能使函數上下通用了😁
  • Q: 出現很奇怪的數字(一開始只寫加法函數的時候)
  • A:整半天發現是index寫成了factor(尷了個尬),輸出就出錯了
  • Q:還很經常出現這種情況(嘆氣不大會用vs來着)
  • A:百度了一下解決方案,其實基本上就是寫的時候不小心或者沒考慮全,方案如下:0xCDCDCDCD錯誤解決方法是結構體要初始化。鏈表的末尾一定要保持指向NULL才能用tmp->next==NULL來判斷結尾,0xcdcdcdcd是一個未知值,新建的指針正好指向這個,但是不保證每次都是這個。所以,重點不是tmp的問題,而是tmp1->next=NULL。此時保證新建的尾節點只向NULL。
  • Q:加法函數的做法會導致乘法結果的同類項不能合並:

  • A:改用邊算邊插入的寫法(調不出來來着qaq🤦‍

3.1 題目

題目

L1-6 幸運彩票
彩票的號碼有 6 位數字,若一張彩票的前 3 位上的數之和等於后 3 位上的數之和,則稱這張彩票是幸運的。本題就請你判斷給定的彩票是不是幸運的。

輸入格式:
輸入在第一行中給出一個正整數 N(≤ 100)。隨后 N 行,每行給出一張彩票的 6 位數字。

輸出格式:
對每張彩票,如果它是幸運的,就在一行中輸出 You are lucky!;否則輸出 Wish you good luck.。

3.2 解題思路

兩種算法

  • 1.比較容易想到的暴力方法(利用%和/,化為數字和),加減求和直接判斷寫法(這種做法很直接,但是略微有些笨
  • 2.利用字符串,將輸入的數字以字符串的形式存取,通過ASCII碼值和的比較來判斷結果。

3.3 代碼截圖

3.4 學習體會

  • 選取了天梯賽上的一道題目,是相對比較容易的一道題目。其實本來選取的是leecode上的一題很神奇地將時間復雜度從n3降到了n,不過是java的代碼(看不太懂來着,本來以為只是看起來比較復雜,實際上真的很復雜qaq,代碼如下。問了學姐,用到了hash樹的原理,因為哈希樹存的是鍵值對(看到這個程度我大概覺得自己應該是不能消化這一塊的內容了。不過這里用的一個思想也是將字符轉化為對應的ASCII碼然后用hash等方法簡便運算,所以就退而求其次找了天梯賽上的題目(代碼不難,主要是想讓自己記住字符轉數字的判斷方法

  • 第三塊內容在尋找優秀代碼的過程當中,還是比較糾結的。leecode上面有帶題解的優秀代碼很多都是java或者python寫的,當然評論區也會有網友們的一些寫法也值得參考。在尋找過程當中,也嘗試去找vector等stl容器的源碼(尋思着掌握了比較好理解來着)但是太長了就有點自閉(尋思着下一次爭取看一些源碼叭,本學期打算先從一些比較簡便的算法學起,再掌握源碼,語法等。


免責聲明!

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



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