上節課作業的錯誤:
演算法的可行性是指演算法中的每一步都可以通過已經實現的基本運算的有限次執行得以實現。
確定性:演算法的每一步必須有確切的含義,無二義性。演算法的執行對應著的相同的輸入僅有唯一路徑。
每乙個線性表有唯一的第一元素
每乙個線性表有唯一的最後元素
除了最後乙個元素之外的每乙個元素都有唯一後繼
除了第乙個元素外的每乙個元素都有唯一前驅
線性表的定義:線性表是具有相同資料型別的n個資料元素的有限序列。
初始條件:表l不存在
操作結果:構造乙個空的線性表
初始條件:表l存在
操作結果:返回線性表中所含元素的個數
初始條件:表l存在且1<=i<=length_list(l)
初始條件:線性表l存在,x是給定的資料元素
初始條件:線性表l存在,插入位置正確(1<=i<=n+1,n為插入前的表長)。
初始條件:線性表l存在,1<=i<=n。
一維陣列在記憶體中占用的儲存空間就是一組連續的儲存區域
表長為last + 1,第乙個到第n個資料元素分別存放在data[0]~data[last]中。
//定義結構體
typedef
struct
seqlist;
將last指標置為 -1,表示表中沒有資料元素。因為在判斷表空時,l->last = maxsize - 1;當表空時maxsize = 0 ,則maxsize - 1 = -1,所以last = -1時表空。
//初始化表
seqlist *
init_seqlist()
時間複雜度為:n
//插入表操作,時間複雜度:n
intinsert_seqlist
(seqlist *l,
int i,
int x)
else
if(i > l->last +
2|| i <1)
else
}
有序表插入,插入條件滿足之後直接從表後判斷大小,l->data大於x就將data向後移動,再向前查詢,直到data小於x或者到表頭,插入到i+1的位置,因為i的位置是小於x的。
//插入有序表
intinsert_seqlist_ord
(seqlist *l, datatype x)
else
l->data[i +1]
= x;
l->last++
;return1;
}}
查詢元素下標,時間複雜度為:n²
//查詢元素下標,時間複雜度:n^2
intlocation_seqlist
(seqlist *l,
int x)
時間複雜度:n
//刪除表操作,時間複雜度:n
intdelete_seqlist
(seqlist *l,
int i)
else
}
typedef
struct nodelnode,
*linklist;
鍊錶與順序表不同,它是一種動態管理的儲存結構,鍊錶中的每個結點占用的儲存空間不是預先分配的,而是執行時系統根據需求生成的。因此建立單鏈表從空表開始,每讀乙個資料元素則申請乙個結點。
1、在鍊錶的頭部插入結點建立單鏈表
//建立單鏈表,將新結點插入鍊錶的頭部!當輸入為-1時結束插入
linklist creat_linklist1()
printf
("建立成功.\n鍊錶長度:%d\n"
,length_linklist
(head));
show_linklist
(head)
;return head;
}
2、在單鏈表的尾部插入結點建立單鏈表
在頭部插入建立單鏈表簡單,但讀入的資料元素的順序與生成的鍊錶中的元素的順序是相反的,若希望順序一致,可以採用尾部插入的方法。因此每次是新結點插入到鍊錶的尾部,所以需加入乙個指標r,用來始終指向鍊錶中的尾結點,以便能夠將新結點插入到鍊錶的尾部。
//建立單鏈表,將新結點插入鍊錶的尾部!當輸入為-1時結束插入
linklist creat_linklist2()
r->next =
null
;printf
("建立成功.\n鍊錶長度:%d\n"
,length_linklist
(head));
show_linklist
(head)
;return head;
}
帶頭節點的單鏈表求表長演算法
//求鍊錶長度
intlength_linklist
(linklist head)
return i;
}
時間複雜度:n
//查詢資料結點
lnode *
location_linklist
(linklist head,datatype x)
時間複雜度:n
//在i位置插入data為x的結點
intinsert_linklist
(linklist head,
int i, datatype x)
}
時間複雜度:n
/*
刪除i處結點
return: 0 刪除失敗, 1 刪除成功
*/int
del_linklist
(linklist l,
int i)
else
}
方法簡單,各種高階語言都有陣列,容易實現
不用為表示結點間的邏輯關係而增加額外的儲存開銷
順序表具有按元素序號隨機訪問的特點
在順序表中做插入、刪除操作時,平均移動大約表中一半的元素,因此對資料元素的個數較多的順序表來說效率低。
需要預先分配足夠大的儲存空間。預先分配過大,可能會導致順序表後部大量閒置;過小又會造成溢位。
思考1:如何讀取任意資料元素?已知基位址為loc(a1),每個元素占用k個儲存單元,第i個資料元素的儲存位址為?
公式:loc(ai)=loc(a1)+(i-1)*k
小結:順序表是隨機的訪問結構,計算任意元素儲存位址的時間相等,即查詢操作的時間效能:o(1)
資料結構 順序表
順序表的特徵 1由唯一的表名標識 2佔據一塊連續的儲存空間 3資料順序存放,元素之間有先後關係 定義動態的順序表 define maxsize 100 typedef struct sqlist 這個結構體型別存放的是順序表的資訊和順序表的資料 初始化順序表 void initsqlist sqli...
資料結構 順序表
順序表示最簡單的乙個資料結構,直接貼 吧,因為比較簡單。include include typedef struct sqlist sqlist void initlist sqlist l l length 0 void getelem sqlist l 初始化 l length j printf...
資料結構順序表
include include include include include include include include include include include include include include using namespace std define maxn 100000...