順序表中的思路

2022-01-10 16:02:46 字數 2762 閱讀 4167

在c語言當中判斷陣列的長度是比較麻煩的,不像其他語言可以通過物件的屬性或者方法來獲得長度。

int arr[4

];int length = sizeof(arr)/sizeof(arr[0]); //

陣列佔記憶體總空間,除以單個元素佔記憶體空間大小

而有一種類似陣列的資料結構叫線性表,可以用來很方便的獲取陣列的長度。其結構體為

typedef struct

list;

該資料結構除了定義了乙個長度為1024的陣列外,還多定義乙個變數last用於儲存陣列長度,

如果要使用這種資料型別完成基本的讀寫操作,那麼:

定義該指標為:list * list;

寫入資料則為:list->data[0] = 32;

讀取長度則為:printf("the length is %d\n",list->last);

而對於這種 「自帶長度的陣列「 資料結構有兩個問題:

1.它是否能完成一些比較高階的操作呢?如:新增,插入,刪除,讀取。

2.如果可以完成,那它不就是動態陣列了嗎?因為新增,刪除,插入是會改變陣列的長度的。

首先說說第二個問題

事實上這種資料結構並非動態陣列,因為在結構體裡已經宣告了1024個位元組給這個陣列,而變數last只是表示

當前有效儲存值的長度,而不是這個陣列的總長度,這個當前儲存長度是不能超過這個最大長度1024個位元組的。

也就是說無論你做新增,刪除,或者插入,陣列的總長度仍然是1024個位元組。因此不是動態陣列。

然後再來看第乙個問題

資料結構的存在的意義在於其內部結構是否孕育出乙個好的演算法在其身上,好的演算法讓我們對這些資料所做的處理

介紹這個資料結構的名稱了,它叫順序表。

首先是初始化順序表

list * createlist(void

)

然後下分析如何實現插入和刪除操作:(在此獻上自畫的醜圖)

如第一行所示,我們已經初始化了乙個長度為5的順序表,並為其附上值,而list->last表示當前儲存長度,也就是5

第二行紅色字型表示在下標為2的地方插入乙個值(30)。這時候為了保留原有的值,因此從下標為2開始後面的值

都需要往後面挪一位,騰出空位來,另外必須按照a,b,c,d的順序來挪動,因為你先把橋拆了怎麼過河?最後list->last++

表示儲存長度+1

第三行是對第二行進行刪除操作,即對下標為2的值的刪除操作,那麼需要把後面2後面的陣列往前挪動來覆蓋其值

操作的順序一樣也需要按照圖中註明的a,b,c來執行,最後讓list->last--;

思路有了後,上**:

插入操作

void insertlist(list *list,int index,int

value)

刪除操作

void deletelist(list *list,int

index)

追加操作

value)

讀取操作就直接  list->data[x] 長度也是 list->last;

然後分析一下時間效能:

對於插入和刪除操作都需要大量元素挪動位置,並且隨著儲存元素的增加,挪動的次數也會增加,所以最壞的時間複雜度是o(n)

而插入和刪除最好的情況就是對最後乙個元素操作,那麼不需要挪動其他元素,最好的時間複雜度為o(1)

因此插入和刪除的平局時間複雜度為 o(1) + o(n) = o(n)

對於讀取和追加,都不需要挪動其他元素的位置,因此時間複雜度為o(1)

順序表的思路就說到這了,最後來點和順序表

1 #include 2 #include 3

#define max 100

4#define error 0

5#define ok 1

67 typedef struct

list;

1112

13 list * createlist(void)18

19void printlist(list *list)

2728 printf("\n"

);29}30

31value)

3738 list->data[list->last] =value;

39 list->last++;40}

4142

void insertlist(list *list,int index,int

value)

4849

inti;

50for(i=list->last;i>index;i--)

51 list->data[i] = list->data[i-1

];52

53 list->data[i] =value;

54 list->last++;55}

5657

void deletelist(list *list,int

index)

6263

inti;

64for(i=index;ilast;i++)

65 list->data[i] = list->data[i+1

];66

67 list->last--;68}

6970

intmain()

list code

link.code

順序表 有序順序表的插入

本題要求實現遞增順序表的有序插入函式。l是乙個遞增的有序順序表,函式status listinsert sortedsq sqlist l,elemtype e 用於向順序表中按遞增的順序插入乙個資料。比如 原資料有 2 5,要插入乙個元素3,那麼插入後順序表為2 3 5。要考慮擴容的問題。stat...

順序表 順序表定位

這兩個題本質一模一樣,唯一不同的是本題利用 順序表 將陣列a包裝了起來。在遍歷的過程中,拿順序表的資料去和x比對,若相同,返回當前下標值,若到了最後乙個資料元素都不相同,就返回 1 1.遍歷順序表 2.挨個比對資料元素 prism lang c include const int max 20 設定...

資料結構 線性表中的順序表 定長順序表

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