順序表是用一段實體地址連續的儲存單元依次儲存資料元素的線性結構,一般情況下採用陣列儲存。在陣列 上完成資料的增刪查改。
順序表一般可以分為:
1. 靜態順序表:使用定長陣列儲存。
2. 動態順序表:使用動態開闢的陣列儲存。
靜態順序表的基本操作
標頭檔案,給出函式的宣告
裡面給出了靜態順序表和動態順序表的定義,下面的基本操作函式都是針對動態順序表
#pragma once
//靜態順序表
#define n 100
typedef int datatype;
typedef struct seqlist seqlist;
//動態順序表
typedef int datatype;
typedef struct seqlist
seqlist, *pseqlist;
//初始化
void seqlistinit(pseqlist ps);
//銷毀
void seqlistdestroy(pseqlist ps);
//檢查容量
void checkcapacity(pseqlist ps);
// 尾插
void seqlistpushback(pseqlist ps, datatype data);
// 尾刪
void seqlistpopback(pseqlist ps);
// 頭插
void seqlistpushfront(pseqlist ps, datatype data);
// 頭刪
void seqlistpopfront(pseqlist ps);
// 任意位置(pos)插入
void seqlistinsert(pseqlist ps, int pos, datatype data);
// 任意位置刪除
void seqlisterase(pseqlist ps, int pos);
// 移除順序表中第乙個值為data的元素
void seqlistremove(pseqlist ps, datatype data);
// 移除順序表中所有值為data的元素
void seqlistremoveall(pseqlist ps, datatype data);
// 獲取順序表有效元素個數
int seqlistsize(pseqlist ps);
// 獲取順序表的容量
int seqlistcapacity(pseqlist ps);
// 獲取順序表中第乙個元素
int seqlistfront(pseqlist ps);
// 獲取順序表中最後乙個元素
int seqlistback(pseqlist ps);
//列印
void seqlistprint(seqlist *ps);
函式定義
#include #include #include #include "seqlist.h"
//初始化
void seqlistinit(pseqlist ps)
//銷毀
void seqlistdestroy(pseqlist ps)
//檢查容量
void checkcapacity(pseqlist ps)
int new_capacity = ps->_capacity * 2;
datatype *new_array = (datatype *)malloc(sizeof(datatype)*new_capacity);
assert(new_array);
//搬移元素
for (int i = 0; i < ps->_size; ++i)
//釋放原來的空間,繫結新空間,以及修改順序表資訊
free(ps->_array);
ps->_array = new_array;
ps->_capacity = new_capacity;
}// 尾插
void seqlistpushback(pseqlist ps, datatype data)
// 尾刪
void seqlistpopback(pseqlist ps)
// 頭插
//需要將所有元素向後搬移,但是為了防止覆蓋資料,需要從最後乙個元素開始搬移
void seqlistpushfront(pseqlist ps, datatype data)
ps->_array[0] = data;
++ps->_size;
}// 頭刪
//將所有元素向前搬移,從第乙個元素開始直接覆蓋它的前乙個位置元素即可
//不能從最後乙個元素搬移,也是為了防止覆蓋前乙個元素,丟失資料
void seqlistpopfront(pseqlist ps)
--ps->_size;
}// 任意位置(pos)插入
//先將 pos 位置到 size 元素向後搬移,最後在 pos 位置插入 data 元素,類似與頭插
void seqlistinsert(pseqlist ps, int pos, datatype data)
ps->_array[pos-1] = data;
++ps->_size;
}// 任意位置刪除
//將 pos 位置到 size 位置元素向前搬移,類似與頭刪
void seqlisterase(pseqlist ps, int pos)
--ps->_size;
}// 檢測data在順序表中
int seqlistfind(pseqlist ps, datatype data)
} return -1;
}// 移除順序表中第乙個值為data的元素
//先呼叫 seqlistfind 找到 data 元素空間位置下標
//再呼叫 seqlisterase 刪除當前位置元素
void seqlistremove(pseqlist ps, datatype data)
}// 移除順序表中所有值為data的元素
//若需要刪除直接用後乙個元素覆蓋當前元素,最後得出新的順序表
void seqlistremoveall(pseqlist ps, datatype data)
} ps->_size = j;
}// 獲取順序表有效元素個數
int seqlistsize(pseqlist ps)
// 獲取順序表的容量
int seqlistcapacity(pseqlist ps)
// 檢測順序表是否為空
int seqlistempty(pseqlist ps)
else
return 0;
}// 獲取順序表中第乙個元素
datatype seqlistfront(pseqlist ps)
// 獲取順序表中最後乙個元素
datatype seqlistback(pseqlist ps)
//列印
void seqlistprint(pseqlist ps)
printf("\n");
}
測試程式
int main()
1. 中間/頭部的插入刪除,時間複雜度為o(n)
2. 增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗。
3. 增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以後增容到200, 我們再繼續插入了5個資料,後面沒有資料插入了,那麼就浪費了95個資料空間。
4.順序表空間連續、支援隨機訪問
鍊錶概念,以及基本操作C語言實現
鍊錶是一種物理儲存結構上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 實際中煉表的結構非常多樣,以下情況組合起來就有8種鍊錶結構 1.單向 雙向 2.帶頭 不帶頭 3.迴圈 非迴圈 帶頭雙向迴圈鍊錶 結構最複雜,一般用在單獨儲存資料。實際中使用的鍊錶資料結構,都是帶頭...
順序表的基本操作(C語言)
define list init size 100 線性表初始分配量 define listincreament 10 分配增量 include include typedef struct sqlistsqlist 定義線性表 void creat sqlist sqlist l 判斷表是不是空表...
順序表基本操作實現 c語言
include include include define max size 100 typedef int elemtype typedef struct node seqlist 初始化乙個空的順序表 seqlist initseqlist l length 0 printf 順序表初始化成功...