第三次作業 順序表與鍊錶

2022-08-12 02:39:13 字數 4477 閱讀 4440

這個作業屬於哪個課程

這個作業要求在**

homework/11232

這個作業的目標

《掌握線性表與鍊錶的概念與演算法》

學號2018204098

一、實驗目的

1、掌握線性表中元素的前驅、後續的概念。

2、掌握順序表與鍊錶的建立、插入元素、刪除表中某元素的演算法。

3、對線性表相應演算法的時間複雜度進行分析。

4、理解順序表、鍊錶資料結構的特點(優缺點)。

二、實驗預習

說明以下概念

1、線性表:線性表是n個具有相同特性的資料元素的有限序列。資料元素是乙個抽象的符號,其具體含義在不同的情況下一般不同。在稍複雜的線性表中,乙個資料元素可由多個資料項組成,此種情況下常把資料元素稱為記錄,含有大量記錄的線性表又稱檔案。線性表中的個數n定義為線性表的長度,n=0時稱為空表。

2、順序表:順序表是在計算機記憶體中以陣列的形式儲存的線性表,線性表的順序儲存是指用一組位址連續的儲存單元依次儲存線性表中的各個元素、使得線性表中在邏輯結構上相鄰的資料元素儲存在相鄰的物理儲存單元中,即通過資料元素物理儲存的相鄰關係來反映資料元素之間邏輯上的相鄰關係,採用順序儲存結構的線性表通常稱為順序表。

3、鍊錶:鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。  

三、實驗內容和要求

1、閱讀下面程式,在橫線處填寫函式的基本功能。並執行程式,寫出結果。

#include#include#define error 0

#define ok 1

#define init_size 5 /*初始分配的順序表長度*/

#define increm 5 /*溢位時,順序表長度的增量*/

typedef int elemtype; /*定義表元素的型別*/

typedef struct sqlistsqlist;

int initlist_sq(sqlist *l); /* 順序表初始化 */

int createlist_sq(sqlist *l,int n); /* 建立順序表 */

int listinsert_sq(sqlist *l,int i,elemtype e);/* 順序表元素輸入 */

int printlist_sq(sqlist *l); /*輸出順序表的元素*/

int listdelete_sq(sqlist *l,int i); /*刪除第i個元素*/

int listlocate(sqlist *l,elemtype e); /*查詢值為e的元素*/

int initlist_sq(sqlist *l)/*initlist*/

int createlist_sq(sqlist *l,int n)/*printlist*/

int listinsert_sq(sqlist *l,int i,elemtype e)

for(k=l->length-1;k>=i-1;k--)

l->slist[i-1]=e;

l->length++;

return ok;

}/*listinsert*/

/*在順序表中刪除第i個元素*/

int listdelete_sq(sqlist *l,int i)

/*在順序表中查詢指定值元素,返回其序號*/

int listlocate(sqlist *l,elemtype e)

int main()

else

printf("error");

return 0;

}

執行結果

演算法分析

時間複雜度:o(n^3)

空間複雜度:o(1)

2、為第1題補充刪除和查詢功能函式,並在主函式中補充**驗證演算法的正確性。

刪除演算法**:

int listdelete_sq(sqlist *l,int i)
執行結果

演算法分析

時間複雜度:o(n^2)

空間複雜度:o(1)

查詢演算法**:

int listlocate(sqlist  *l,elemtype e)

執行結果

typedef int elemtype; /*定義表元素的型別*/

typedef struct lnodelnode,*linklist;

linklist createlist(int n); /* 建立鍊錶 */

void printlist(linklist l); /*輸出帶頭結點單鏈表的所有元素*/

int getelem(linklist l,int i,elemtype *e); /* 得到固定位置的元素 */

linklist createlist(int n)

return head;

}/*createlist*/

void printlist(linklist l)

}/*printlist*/

int getelem(linklist l,int i,elemtype *e)

if(!p||j>i)

return error;

*e=p->data;

return ok;

}/*getelem*/

int main()else

printf("error");

return 0;

}執行結果

演算法分析

時間複雜度:o(n)

空間複雜度:o(1)

4、為第3題補充插入功能函式和刪除功能函式。並在主函式中補充**驗證演算法的正確性。

插入演算法**:

int insertlist(linklist *l,int i,elemtype e)

if(!p||c>i )

q = (linklist)malloc(sizeof(node ));

q->data = e;

q->next = p->next;

p->next = q;

return ok ;

}

執行結果

演算法分析

時間複雜度:o(n);

空間複雜度:o(1)

刪除演算法**:

int linklist_delete_sq(sqlist *l,int i)typedata; 

typedef struct node

listnode;

typedef listnode *linklist;

linklist head;

int main()

printf("請任意輸入乙個數m:");

scanf("%d",&m);

if(m<=0) printf("error");

do p=q->next;

q->next=p->next;

printf("num:%d\tval:%d\n",p->data.num,p->data.val);

m=p->data.val;

free(p);

} while(q->next!=q);

printf("num:%d\tval:%d\n",q->data.num,q->data.val);

free(q);

free(head);

printf("約瑟夫環結束!\n");

}

四、實驗小結

通過本次實驗,理解了線性表中元素的前驅、後續的概念。

知道了順序表與鍊錶的建立、插入元素、刪除表中某元素的演算法的實現。

通過本次實驗的練習 加深了自己對宣發的理解。

第三次作業 順序表與鍊錶

這個作業屬於哪個課程 這個作業要求在 homework 11232 這個作業的目標 理解線性表順序表和煉表,並且掌握順序表與鍊錶的建立插入刪除元素的演算法 學號2018204245 一 概念 線性表 線性表是最基本 最簡單 也是最常用的一種資料結構。線性表 linear list 是資料結構的一種,...

第三次作業

2 12有600 mb 兆位元組 的資料,需要從南京傳送到北京。一種方法是將資料寫到磁碟上,然後託人乘火車這 些磁碟捎去。另一種方法是用計算機通過長途 線路 設資訊傳送的速率為2.4kb s 傳送此資料。試比較這兩種方法的優劣。若資訊傳送速率為33.6kb s,其結果又如何?解 當傳送速率為2.4k...

第三次作業

1 有600mb 兆位元組 的資料,需要從南京傳送到北京 一種方法是將資料寫到磁碟上,然後託人乘火車將這些磁碟捎去。另一種方法是用計算機通過長途 線路 設資訊傳送的速率為2.4kb s 傳送此資料,試比較這兩種方法的優劣。若資訊傳送的速率為33.6kb s,其結果又如何?解 假定連續傳送且不出錯。若...