DS博客做業01--線性表

1.本週學習總結

##1.1思惟導圖 ##1.2.談談你對線性表的認識及學習體會算法

線性表的儲存結構分爲順序存儲結構和鏈式存儲結構,對於順序存儲結構就由數組結構和長度組成,而鏈式存儲結構就是利用鏈表來存取數據。相對於順序表而言,鏈表所能存取的數據能夠比較複雜,可是鏈表的操做相對於比較麻煩。應該對問題進行認真分析後再選擇合理的存儲結構來存儲數據。而在本章節中,因爲沒有理解指針的用法,致使程序頻繁出錯,不過在反思下有很多的收穫。

2.PTA實驗做業

##2.1.題目1: 區間刪除數據數組

實如今順序表中刪除某個區間數據。須要實現下述的三個函數完成該功能。
實現函數:
void CreateList(SqList &L,int n);//建順序表,L表示順序表指針,n表示輸入數據個數。 
void DelNode(SqList &L,int min,int max);//刪除區間元素。min,max表示刪除的區間 
void DispList(SqList L); //輸出順序表內容 ,數據間空格隔開,尾部不能有空格。

###2.1.1設計思路函數

1.函數void CreateList(SqList &L,int n)設計
         L=new List;//爲L指針申請動態內存
         for i=1 to i=n { cin>>L->data[i] }; //創建循環輸入數據
         L->length=n; //用L->length順序表元素個數n
2.函數void DelNode(SqList &L,int min,int max)設計
         int j=0 //爲了重構數組,使得該數組從L->data[0]開始
         for i=1 to i=L->length
             if(L->data[i]>max||L->data[i]<min); //判斷L->data[i]是否落在要求的區間內
                 若在區間(min,max)內 則運行L->data[j]=L->data[i] ; j++
                //將落在區間的 L->data[i] 的值給 L->data[j] ,進行數組重構 ,運行後 j 自增 1
        最後將重構的數組長度記做 j 即進行 L->length=j
3.函數void DispList(SqList L)設計
         運用for循環輸出重構的順序表順序表

###2.1.2代碼截圖學習

###2.1.3本題PTA提交列表說明 spa

本題在定義L指針後沒有分配動態空間

##2.2.題目2 有序鏈表合併設計

已知兩個遞增鏈表序列L1與L2,2個鏈表都是帶頭結點鏈表。設計函數實現L1,L2的合併,合併的鏈表仍然遞增有序,頭結點爲L1的頭結點。 合併後須要去除重複元素。
1.輸入格式: 輸入分兩行,先輸入數據項個數,再輸入數據項,數字用空格間隔。
2.輸出格式: 在一行中輸出合併後新的遞增鏈表,數字間用空格分開,結尾不能有多餘空格;

###2.2.1 設計思路3d

函數void MergeList(LinkList &L1,LinkList L2)設計
//利用合併再進行冒泡排序處理兩組數據的合併,對兩組數據沒有順序的要求
    LinkList head,ptr; //定義兩個結構體指針
    head=L1->next;//先將L1->next指針給head
    for ptr=head to ptr->=NULL  ptr->next=L2->next //遍歷head找到尾結點後和L2->next鏈接
   //用相似於冒泡排序法對鏈表進行排序,並進行刪除重複數據的操做
   for ptr1=head to ptr1->next!=NULL 
       for ptr2=head to ptr2->next!=NULL
            if(ptr2->data>ptr2->next->data) 將ptr2->data和ptr2->next->data進行數值交換
            if(ptr2->data==ptr2->next->data) 
            //判斷重複後先用ptr3存取ptr2->next所存取的地址,再將ptr2->next和ptr2->next->next鏈接,最後釋放ptr3的空間
                ptr3=ptr2->next ; 
                ptr2->next=ptr2->next->next ; 
                delete(ptr3) ;
   最後把head指針存取的地址賦給L1->next

###2.2.2 代碼截圖 ###2.2.3 本題PTA提交列表說明 指針

1.因爲本題是在沒有編譯器的條件下直接在pta網頁直接完成,語法錯誤形成編譯錯誤
 2.在語法錯誤都解決的狀況下,沒有控制好for循環致使了錯誤
 3.最後是漏了刪除重複數據的操做

##2.3 題目3 一元多項式的乘法與加法運算code

設計函數分別求兩個一元多項式的乘積與和。
輸入格式:
輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入一個多項式非零項係數和指數(絕對值均爲不超過1000的整數)。數字間以空格分隔。
輸出格式:
輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。零多項式應輸出0 0。

###2.3.1 設計思路blog

先設計主函數main()
        SqList L1,L2;//定義指針變量L1,L2
	CreateList(L1,n);//創建順序表L1
	CreateList(L2,m);//創建順序表L2
	multiplicative(L1,L2);//輸出乘法運算結果
	Add(L1,L2);//輸出加法運算結果
函數void CreateList(SqList &L,int n)設計
        int ratio,index; //定義兩個整形變量以提供輸入數值的存儲,這裏ratio,index是指d輸入多項式的指係數和指數
        for i=1 to i=n 輸入radio和index 進而L->data[index]=ratio //數組下標爲指數,內容爲係數
函數void multiplicative(SqList &L1,SqList &L2)設計
        int a[2500] 新定義數組a來存取最終運算結果
        定義兩個整形變量p,q 
        //p爲了儲存兩個項係數相乘後的數值,q爲了儲存指數相加後的數值
        //(乘法的兩項相乘就是係數相乘,指數相加)
         for i=0 to i=1000
             for j=0 to j=1000
                 p=(L1->data[i])*(L2->data[j]);//p儲存兩個項係數相乘後的數值
		 q=i+j;//q儲存指數相加後的數值
                 a[q]=a[q]+p;//即 a[指數]=係數 將運算結果存入a數組中,注意係數應該是要累加的
          最後利用for循環輸出a數組
函數void Add(SqList &L1,SqList &L2)設計
         for i=0 to i=1000
            若是 L1->data[i]+L2->data[i]的結果不爲零,直接輸出結果

###2.3.2 代碼截圖 ###2.3.3 本題PTA提交列表說明

1.沒有注意零式的輸出格式
2.數組越界

3.閱讀代碼

##3.1 題目 有序鏈表合併

已知兩個遞增鏈表序列L1與L2,2個鏈表都是帶頭結點鏈表。設計函數實現L1,L2的合併,合併的鏈表仍然遞增有序,頭結點爲L1的頭結點。 合併後須要去除重複元素。
1.輸入格式: 輸入分兩行,先輸入數據項個數,再輸入數據項,數字用空格間隔。
2.輸出格式: 在一行中輸出合併後新的遞增鏈表,數字間用空格分開,結尾不能有多餘空格;

##3.2 解題思路

1.本人方法 合併鏈表後進行冒泡法排序
2.該同窗方法 用兩個指針同時遍歷兩個鏈表,一邊遍歷一邊比較和插入
3.兩種方法優劣
   (1) 合併鏈表後進行冒泡法排序適用範圍較廣,能夠用於兩個無序鏈表的合併,可是時間複雜度相對最大
   (2) 用兩個指針同時遍歷兩個鏈表,一邊遍歷一邊比較和插入只能用於合併兩個有序的鏈表,可是時間複雜度相對較小

##3.3 代碼截圖 ###參考同窗的代碼 ##3.4 學習體會

在設計出的程序能運行的條件下,時間複雜度和空間複雜度小的代碼更勝一籌,而將時間複雜度和空間複雜度降到最小就依賴於程序的算法。從此應當學習多多學習和設計出好的算法,使代碼更加簡單優質
相關文章
相關標籤/搜索