線性表順序儲存結構

2021-10-03 07:56:19 字數 3936 閱讀 7572

目錄

線性表的定義

線性表抽象資料結構定義

線性表的順序儲存結構

順序儲存結構的插入與刪除

插入操作

刪除操作

順序儲存結構的優點和缺點 **

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 ...