資料結構實驗一
南昌航空大學實驗報告
二0 21 年 4 月 19 日
課程名稱: 資料結構實驗 實驗名稱: 線性表的鏈式儲存結構
班級: 姓名: 同組人:
指導教師評定: 簽名:
一、 需求分析
題目:設計並驗證以下演算法:設順序表L中的資料元素為整數且非遞增有序,刪除其值相同的多餘元素,即順序表L中相同的元素只保留一個,並逆置刪除後的順序表
(1)根據鍵盤輸入資料建立順序L。
(2)輸出順序表L,刪除值相同多餘元素後的順序表L、逆置的順序表L。
(3)假設順序表L的長度為n,要求以 O(n)的時間複雜度完成對值相同多餘元素的刪除。
1、在本次實驗中,首先,建立順序表L,再刪除順序表L的多餘元素,然後將新的到的順序表逆置,最後輸出所得到的三個順序表。
2.演示程式以使用者和計算機對話的方式進行,即在計算機終端上顯示“提示資訊”之後,由使用者在鍵盤上輸入順序表L。輸出三個要求的順序表。
3.程式執行的命令包括:
(1)建立順序表L;
(2)輸出順序表
(3)將順序表中多餘元素刪除得到新順序表L1;
(4)輸出順序表L1;
(5)將順序表L1逆置得到新的順序表L2;
(6)輸出順序表L2;
(7)結束。
4.測試資料
輸入:8
9 9 8 7 6 6 5 4
輸出:順序表:9 9 8 7 6 6 5 4
刪除相同多餘元素後的順序表:9 8 7 6 5 4
逆置的順序表:4 5 6 7 8 9
二、 概要設計
1. 抽象資料型別定義
為實現上述程式功能,需要一個抽象資料型別:
ADT Graph{
基本操作:
List InitList(List l)
操作結果:將新建順序表初始化;
List CreatList(List l)
操作結果:賦予具體數值給順序表
void PrintList(List l)
操作結果:將順序表輸出
List DelList(List l)
操作結果:刪除順序表中重複多餘的數
List SortList(List l)
操作結果:將順序表逆置
2.程式模組
(1)主程式流程
int main{
初始化、建立順序表;
給順序表賦值;
輸出順序表;
刪除順序表中多於重複元素得到新順序表;
輸出新順序表;
將新順序表再逆置得到新順序表;
輸出新順序表;
}
(2)順序表初始化;
(3)順序表輸入;
(4)順序表刪除;
(5)順序表逆置;
(6)順序表輸出。
3.程式結構圖
各模組之間的呼叫關係如圖所示。
圖1 模組之間呼叫關係圖
三、 詳細設計
1.資料型別及結構體
typedef struct Node
{
int Data[Maxsize];
int len;
}Node,*List;
List InitList(List l);//順序表初始化
List CreatList(List l);//順序表建立
void PrintList(List l);//順序表輸出
List DelList(List l);//順序表多餘元素刪除
List SortList(List l);//順序表逆置
2.主函式
int main()
{
Node node;
List l=&node;
l=InitList(l);
l=CreatList(l);
printf("順序表:\n");
PrintList(l);
printf("\n");
l=DelList(l);
printf("刪除相同多餘元素後的順序表:\n");
PrintList(l);
printf("\n");
l=SortList(l);
printf("逆置的順序表:\n");
PrintList(l);
return 0;
}
四、 除錯分析
1.第一次完成順序表多餘元素刪除與順序表逆置時建立一個新的線性表去實現,通過改進在原線性表上完成多餘元素的刪除與逆置。
2. 順序表多餘元素刪除用for語句找到重複元素,將後邊元素都往前推進,完成後再尋找下一個重複元素,時間複雜度不為O(n),改進程式碼如下:
for(i=1,j=1;i<l->len;i++)
{
if(l->Data[i]!=l->Data[i-1])
{
l->Data[j++]=l->Data[i];
}
}
五、 使用者手冊
1. 本程式的執行環境為DOS作業系統,執行檔案為:main.exe。
2. 進入演示程式後即顯示文字方式的使用者介面。
3. 程式執行後,輸入順序表表長以及順序表元素。
4. 輸出三種順序表。
六、 測試結果
測試結果:
輸入:8
9 9 8 7 6 6 5 4
輸出:順序表:9 9 8 7 6 6 5 4
刪除相同多餘元素後的順序表:9 8 7 6 5 4
逆置的順序表:4 5 6 7 8 9
七、 附錄
原始碼:#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10000
typedef struct Node
{
int Data[Maxsize];
int len;
}Node,*List;
List InitList(List l)//初始化
{
l->len=0;
return l;
}
List CreatList(List l)//建立
{
scanf("%d",&l->len);
int i;
for(i=0;i<l->len;i++)
scanf("%d",&l->Data[i]);
return l;
}
void PrintList(List l)//輸出
{
int i;
for(i=0;i<l->len;i++)
{
printf("%d ",l->Data[i]);
}
}
List DelList(List l)//刪除
{
int i,j;
for(i=1,j=1;i<l->len;i++)
{
if(l->Data[i]!=l->Data[i-1])
{
l->Data[j++]=l->Data[i];
}
}
l->len=j;
return l;
}
List SortList(List l)//逆置
{
int i,j,num;
{
for(i=0,j=l->len-1;j-i>0;i++,j--)
{
num=l->Data[i];
l->Data[i]=l->Data[j];
l->Data[j]=num;
}
}
return l;
}
int main()
{
Node node;
List l=&node;
l=InitList(l);
l=CreatList(l);
printf("順序表:\n");
PrintList(l);
printf("\n");
l=DelList(l);
printf("刪除相同多餘元素後的順序表:\n");
PrintList(l);
printf("\n");
l=SortList(l);
printf("逆置的順序表:\n");
PrintList(l);
return 0;
}