??前言
? 什么是數(shù)據(jù)結(jié)構(gòu)?我們?yōu)槭裁匆獙W(xué)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)中的順序表長(zhǎng)什么樣子?它是怎么運(yùn)用?
? 本期我們將對(duì)這些一一講解,徹底明白數(shù)據(jù)結(jié)構(gòu)的重要性,以及順序表是一種什么的數(shù)據(jù)結(jié)構(gòu)。
???數(shù)據(jù)結(jié)構(gòu)的重要性
??什么是數(shù)據(jù)結(jié)構(gòu)?
? 數(shù)據(jù)結(jié)構(gòu)指的是計(jì)算機(jī)中組織和存儲(chǔ)數(shù)據(jù)的方式。它涉及到數(shù)據(jù)的組織、管理和操作,以便能夠高效地訪問和處理數(shù)據(jù)。
??數(shù)據(jù)結(jié)構(gòu)能干嘛?
? 數(shù)據(jù)結(jié)構(gòu)可以用來解決各種計(jì)算問題,它提供了不同的數(shù)據(jù)類型和操作,使得我們可以有效地存儲(chǔ)和操作數(shù)據(jù)。通過選擇合適的數(shù)據(jù)結(jié)構(gòu),我們可以提高算法的效率,減少時(shí)間和空間的消耗。
??數(shù)據(jù)結(jié)構(gòu)有多重要?
? 它是算法設(shè)計(jì)和優(yōu)化的基礎(chǔ),對(duì)于解決實(shí)際問題和提高計(jì)算機(jī)程序的性能至關(guān)重要。良好的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)可以提高程序的可讀性、可維護(hù)性和可擴(kuò)展性,同時(shí)也能夠減少資源的消耗和提高程序的執(zhí)行效率。
???順序表的概念與結(jié)構(gòu)
??順序表的概念
? 順序表是一種線性表的存儲(chǔ)結(jié)構(gòu),它將元素順序地存儲(chǔ)在一塊連續(xù)的內(nèi)存空間中。順序表中的元素在內(nèi)存中的物理地址是連續(xù)的,通過元素在內(nèi)存中的相對(duì)位置來表示元素之間的邏輯關(guān)系。
??順序表的結(jié)構(gòu)
? 順序表由兩部分組成:數(shù)據(jù)存儲(chǔ)區(qū)和長(zhǎng)度信息。數(shù)據(jù)存儲(chǔ)區(qū)是一塊連續(xù)的內(nèi)存空間,用來存儲(chǔ)順序表中的元素。長(zhǎng)度信息記錄了順序表中元素的個(gè)數(shù)。
??順序表圖例
???動(dòng)態(tài)順序表的實(shí)現(xiàn)
??順序表所需要的接口
typedef int SLDatatype;
typedef struct SeqList
{
SLDatatype* array;
int size;//有效數(shù)據(jù)個(gè)數(shù)
int capacity;//空間大小
}SL;
//增刪查改
void SLInit(SL* ps);//初始化
void SLdestroy(SL* ps);//銷毀
//打印
void SLprint(SL* ps);
//檢查空間
void Inspect(SL* ps);
//尾插尾刪
void SLpushBack(SL* ps, SLDatatype x);
void SLpopback(SL* ps);
//頭插頭刪
void SLpushFront(SL*ps, SLDatatype x);
void SLpopFront(SL*ps);
//查找數(shù)據(jù)下標(biāo)
int SLFind(SL* ps, SLDatatype x);
//在pox位置插入x
void SLInsert(SL* ps, int pox,SLDatatype x);
//刪除pox位置的值
void SLErase(SL* ps, int pox);
//修改pox位置的值
void SLModify(SL* ps, int pox, SLDatatype x);
??順序表的初始化
對(duì)順序表進(jìn)行初始化,使表的開始大小可以存儲(chǔ)4個(gè)有效元素。
void SLInit(SL* ps)
{
assert(ps);
ps->array = (SLDatatype*)malloc(sizeof(SLDatatype) * 4);
if (ps->array == NULL)
{
perror("malloc failde");
exit(-1);
}
ps->size = 0;
ps->capacity = 4;
}
??順序表的空間檢查
若是表中的元素個(gè)數(shù)已滿,則進(jìn)行擴(kuò)容,擴(kuò)容的后大小是原順序表的2倍。
void Inspect(SL* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
SLDatatype* tmp = (SLDatatype*)realloc(ps->array, ps->capacity * 2 * sizeof(SLDatatype));
if (tmp == NULL)
{
perror("realloc failed");
exit(-1);
}
ps->array = tmp;
ps->capacity *= 2;
}
}
??順序表的打印
打印順序表中所有的元素。
void SLprint(SL* ps)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->size; i++)
{
printf("%d ", ps->array[i]);
}
printf("\n");
}
??順序表的尾部插入
在順序表的末尾插入元素。
void SLpushBack(SL* ps, SLDatatype x)
{
assert(ps);
Inspect(ps);
ps->array[ps->size] = x;
ps->size++;
}
??順序表的尾部刪除
將順序表最后一個(gè)元素刪除。
void SLpopback(SL* ps)
{
assert(ps);
assert(ps->size > 0);
ps->size--;
}
??順序表的頭部插入
在順序表的頭部,表中首元素的前面插入新的元素,這時(shí)就需要將舊數(shù)據(jù)都往后挪一位。
void SLpushFront(SL* ps, SLDatatype x)
{
assert(ps);
Inspect(ps);
int len = ps->size - 1;
while (len >= 0)
{
ps->array[len + 1] = ps->array[len];
len--;
}
ps->array[0] = x;
ps->size++;
}
??順序表的頭部刪除
將頭部的首元素刪除。
//頭刪
void SLpopFront(SL* ps)
{
assert(ps);
int left = 1;
while (left < ps->size)
{
ps->array[left - 1] = ps->array[left];
left++;
}
ps->size--;
}
??順序表查找數(shù)據(jù)下標(biāo)
這一步是為了在指定的位置進(jìn)行增刪改查。
int SLFind(SL* ps, SLDatatype x)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
if (ps->array[i] == x)
{
return i;
}
}
return -1;
}
??順序表指定位置插入元素
查找到要插入的位置下標(biāo),將元素插入。
void SLInsert(SL* ps, int pox, SLDatatype x)
{
assert(ps);
assert(pox >= 0 && pox <= ps->size);
Inspect(ps);
int end = ps->size - 1;
while (end >= pox)
{
ps->array[end + 1] = ps->array[end];
end--;
}
ps->array[pox] = x;
ps->size++;
}
??順序表指定位置元素刪除
查找到要?jiǎng)h除的位置下標(biāo),將元素刪除。
void SLErase(SL* ps, int pox)
{
assert(ps);
assert(pox >= 0 && pox < ps->size);
int begin = pox + 1;
while (begin < ps->size)
{
ps->array[begin - 1] = ps->array[begin];
begin++;
}
ps->size--;
}
??順序表修改指定位置的值
查找到要修改的值的位置下標(biāo),將舊的元素改為新的值。
void SLModify(SL* ps, int pox, SLDatatype x)
{
assert(ps);
assert(pox >= 0 && pox < ps->size);
ps->array[pox] = x;
}
??順序表的銷毀
順序表使用完后,可以進(jìn)行釋放空間的操作。
void SLdestroy(SL* ps)
{
assert(ps);
free(ps->array);
ps->array = NULL;
ps->size = ps->capacity = 0;
}
??順序表的特點(diǎn)
- 內(nèi)存連續(xù):順序表的元素在內(nèi)存中是連續(xù)存儲(chǔ)的,可以通過下標(biāo)直接訪問元素。
- 隨機(jī)訪問:由于元素在內(nèi)存中的物理地址是連續(xù)的,可以通過下標(biāo)快速定位和訪問元素。
- 插入和刪除操作效率低:在順序表中插入或刪除元素時(shí),需要移動(dòng)其他元素的位置,導(dǎo)致操作效率較低。
??順序表的劣勢(shì)
- 中間/頭部的插入刪除,時(shí)間復(fù)雜度為O(N)
- 增容需要申請(qǐng)新空間,拷貝數(shù)據(jù),釋放舊空間。會(huì)有不小的消耗。
- 增容一般是呈2倍的增長(zhǎng),勢(shì)必會(huì)有一定的空間浪費(fèi)。例如當(dāng)前容量為100,滿了以后增容到200,我們?cè)倮^續(xù)插入了5個(gè)數(shù)據(jù),后面沒有數(shù)據(jù)插入了,那么就浪費(fèi)了95個(gè)數(shù)據(jù)空間。
???全篇總結(jié)
? 經(jīng)過上述一系列的代碼和文字講解,我們了解了數(shù)據(jù)結(jié)構(gòu)的基本概念,而順序表作為一種數(shù)據(jù)結(jié)構(gòu),它的特性和其獨(dú)特的特點(diǎn)也是非常鮮明。文章來源:http://www.zghlxwxcb.cn/news/detail-715776.html
?? 好了,由于篇幅有限,本章是只介紹了比較簡(jiǎn)單的一種數(shù)據(jù)結(jié)構(gòu)——順序表,后序還會(huì)有更多不同的數(shù)據(jù)結(jié)構(gòu)會(huì)分享給大家。
看到這里希望給博主留個(gè):??點(diǎn)贊??收藏??關(guān)注!
有問題可以評(píng)論或者私信呢秒回哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-715776.html
到了這里,關(guān)于【從零開始拿捏數(shù)據(jù)結(jié)構(gòu)】 順序表是什么?它有什么樣的特性?結(jié)構(gòu)到底是什么樣的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!