目錄
線性表的定義
線性表抽象資料結構定義
線性表的順序儲存結構
順序儲存結構的插入與刪除
插入操作
刪除操作
順序儲存結構的優點和缺點 **
main.c
list.c
list.h
線性表(list): 零個或者多個資料元素的有限序列
注意: 序列說明元素之間是有順序的,若元素存在多個,則第乙個元素無前驅,最後乙個元素無後繼,其他每個元素都有,且只有乙個前驅和後繼,
是有限的,事實上,計算機處理的物件都是有限的
前面給出了線性表的定義,現在分析一下線性表應該有哪些操作:
首先線性表中的元素型別都是一樣的,
對錶進行操作那首先得建立表, 沒有元素就是空表,然後往裡邊填資料元素-初始化, 有些資料需要查詢,有些不合適需要刪除,也可以往裡邊增加資料
於是線性表的抽象資料型別定義如下:
adt線性表(list)
data
線性表中的資料物件集合為,每個資料元素的型別均為datatype.其中除了第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素an外,每乙個元素有且只有乙個後繼元素.資料元素之間的關係是一對一的關係
operation
initlist( *l ): 初始化操作,建立乙個空的線性表l
listempty(l): 若線性表為空,返回ture, 否則返回false
clearlist(*l): 將線性表清空
getelem(l, i, *e): 將線性表l中的第i個元素值返回給e
listinsert(*l, i, e): 線性表中l中第i個位置插入新元素e
listdelet(*l, i, *e): 刪除線性表中第i個位置元素,並用e返回其值
listlengeh(l): 返回線性表l的元素個數
endadt
上面介紹了線性表的抽象資料型別,現在介紹一下其倆種物理結構中的第一種--順序儲存結構
線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素,線性表的順序儲存示意如下:
從上面的示意圖可以看出,線性表的順序儲存結構,其實就是乙個一維陣列,在記憶體中找塊地兒,通過佔位的形式,把一定的記憶體空間給佔了,然後將相同的資料元素依次存放在這塊空地中,
那麼我們可以給出線性表的順序儲存的結構**:
#define maxsize 20 //儲存空間的初始分配量 typedef int elemtype; //elemtype是線性表中元素的型別 typedef struct sqlist;
這裡可以發現順序儲存結構需要三個屬性:
資料元素和存放它的陣列下標之間存在對應關係.如下圖
用陣列儲存順序意味著要分配固定長度的陣列空間,由於線性表中可以進行插入和刪除操作,於是分配的陣列空間是要大於等於當前線性表的長度
儲存器中的每個儲存單元都有自己的編號,這個編號稱為位址,之間有如下關係(loc表示獲得儲存位置的函式)
loc(ai+1) = loc(ai) + c
loc(ai) = loc(a1) + (i-1)*c
對於線性表的順序儲存結構來說,如果要實現getelem操作,只需將其第i個位置元素值返回,也就是下標是i-1的值返回就可:
#define ok 1 #define error 0 #define true 1 #define false 0 typedef int status; /* status是函式的型別,其值是函式結果狀態的** */ /* 初始條件: 順序線性表l已存在,1<=i<=length */ /* 操作結果: 用e返回l中第i個資料元素的值 */ status getelem(sqlist l, int i, elemtype *e)
listinsert
思路:**在後面
listdeldte
思路:平均操作次數:(n-1)/2 插入和刪除時間複雜度: o[n]
存,讀時間複雜度:o[1]
由此可見順序線性表比較適合元素個數不怎麼變化,而更多是訪問資料的應用
1. 無須為表示表中之間的羅技關係而增加額外的儲存空間
2. 可以快速得訪問表中任一位置的元素
1. 插入和刪除操作需要移動大量的資料
2. 當線性表長度變化較大時候,難以缺點儲存空間的容量
/* main.c */
#include #include "list.h"
int main()
,6};
scanlist(l);
/* 查詢乙個線性表單元 */
printf("get_number: ");
scanf("%d", &g);
getelem(l, g, &a);
printf("get_elem : %d\n",a);
/* 插入乙個線性表單元 */
printf("insert_number:");
scanf("%d", &i);
printf("insert_data:");
scanf("%d", &b);
listinsert(&l, i, b);
scanlist(l);
/* 刪除乙個線性表單元 */
printf("delete_number:");
scanf("%d", &d);
listdelete(&l, i, &c);
scanlist(l);
printf("delete data: %d\n", c);
return 0;
}
/* list.c */
#include #include "list.h"
/* 從線性表l中取出第i個元素,並用e返回 */
status getelem(sqlist l, int i, elemtype *e)
/* 遍歷乙個線性表l */
void scanlist(sqlist l)
l->data[i-1] = e;
l->length++;
return ok;
}/* 從線性表l中第i個位置刪除資料元素,用e返回其值 */
status listdelete(sqlist *l, int i, elemtype *e)
l->length--;
return ok;
}
#ifndef _list_h_
#define _list_h
#define maxsize 20
#define ok 1
#define error 0
#define ture 1
#define false 0
typedef int status;
typedef int elemtype;
typedef struct
sqlist, *psqlist;
status getelem(sqlist l, int i, elemtype *e);
void scanlist(sqlist l);
status listinsert(sqlist *l, int i, elemtype e);
status listdelete(sqlist *l, int i, elemtype *e);
#endif
輸出結果如下:
線性表線性(順序)儲存結構
實現順序表的曾刪查操作 元素結構體 define maxsize 100 線性表的最大長度 typedef int elemtype elemtype為線性表元素的型別 typedef struct sequenlist 插入操作 bool insertinseqlist sequenlist l,...
線性表的順序儲存 線性表的順序儲存結構
1,本文實現乙個線性表 2,順序儲存定義 1,線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表中的資料元素 2,在 c 中可以用乙個陣列作為介質來儲存資料元素 3,設計思路 1,可以用一維陣列實現順序儲存結構 1,儲存空間 t m array 2,當前長度 int m length...
線性表 順序儲存結構
s1線性表的基本概念 1 有而且只有乙個 第一元素 2 有而且只有乙個 最後元素 3 除第一元素之外,其他元素都有唯一的直接前驅。4 除最後元素之外,其他元素都有唯一的直接後繼。s2計算公式 若第乙個元素的位址是a,每個元素占用的儲存空間為d,則陣列的第i個元素的位址可以用如下公式計算 loc i ...