網(wǎng)站推廣和宣傳的方法推廣策略有哪些方法
“路雖遠(yuǎn),行則將至”
??主頁:小賽毛
順序表·目錄
1.線性表
2.順序表
概念及結(jié)構(gòu)
靜態(tài)順序表:使用定長數(shù)組存儲元素。
動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲。?
接口實現(xiàn)
1.線性表
線性表 ( linear list ) 是 n 個具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實際中廣泛使
用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊列、字符串 ...
線性表在邏輯上是線性結(jié)構(gòu),也就說是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,
線性表在物理上存儲時,通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲。

2.順序表
概念及結(jié)構(gòu)
順序表與數(shù)組的區(qū)別:順序表的存儲一定是連續(xù)的
順序表是用一段 物理地址連續(xù) 的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存
儲。在數(shù)組上完成數(shù)據(jù)的增刪查改。
順序表一般可以分為:
靜態(tài)順序表:使用定長數(shù)組存儲元素。

空間在一開始的時候就已經(jīng)開好,是定長數(shù)組。
一般情況下,我們不使用靜態(tài)的,因為把握不住到底開辟多大的空間,你把握不住啊,兄弟哈哈哈
動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲。?
?
?存儲數(shù)據(jù)的數(shù)組空間是根據(jù)需求動態(tài)開辟的。
接口實現(xiàn)
靜態(tài)順序表只適用于確定知道需要存多少數(shù)據(jù)的場景。靜態(tài)順序表的定長數(shù)組導(dǎo)致 N 定大了,空
間開多了浪費,開少了不夠用。所以現(xiàn)實中基本都是使用動態(tài)順序表,根據(jù)需要動態(tài)的分配空間
大小,所以下面我們實現(xiàn)動態(tài)順序表。
//動態(tài)順序表
typedef int SLDataType;typedef struct SeqList
{SLDataType* a;int size; //存儲有效數(shù)據(jù)個數(shù)int capacity; //空間大小
}SL;
在調(diào)用接口函數(shù)的時候,這里我們需要注意的是:形參是實參的拷貝,形參的改變不會影響實參。
?
在順序表進(jìn)行插入操作的時候,有時候空間需要擴(kuò)容:
//滿了要擴(kuò)容if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * (sizeof(SLDataType)));if (tmp == NULL){perror("realloc failed");exit(-1);}}
?
?我們這里來舉個例子:
int main() {//SL sl;//SLInit(&sl);int* p1 = (int*)malloc(12);int* p2 = realloc(p1, 20);printf("%p,%p\n", p1, p2);return 0; }
?
?很顯然上面展示的是原地擴(kuò)容,那我們接下來試一個大一點的:
int main() {//SL sl;//SLInit(&sl);int* p1 = (int*)malloc(12);int* p2 = realloc(p1, 200);printf("%p,%p\n", p1, p2);return 0; }
?
很顯然是異地擴(kuò)容。?
在進(jìn)行尾刪操作的時候,我們要進(jìn)行檢測,這個時候呢分為兩種方式:
void SLPopBack(SL* ps)
{// 溫柔的檢查//if (ps->size == 0)//return;// 暴力的檢查assert(ps->size > 0);//ps->a[ps->size - 1] = 0;ps->size--;
}
?頭插:
void SLPushFront(SL* ps, SLDataType x)
{SLCheckCapacity(ps);// 挪動數(shù)據(jù)int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];--end;}ps->a[0] = x;ps->size++;
}
ps:頭插挪動數(shù)據(jù)的時候是從后往前挪
?頭刪:?
void SLPopFront(SL* ps)
{int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];++begin;}ps->size--;
}
SLInsert:在pos位置前插入
//在pos位置插入x void SLInsert(SL* ps, int pos, SLDataType x) {assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];--end;}ps->a[pos] = x;ps->size++; }
?此接口可以搭配SLFind接口使用
int SLFind(SL* ps, SLDataType x) {for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1; }
ps:
int x;scanf("%d", &x);int pos = SLFind(&sl, x);if (pos != -1){SLInsert(&sl, pos, x * 10);}SLPrint(&sl);SLDestroy(&sl);
SLErase:
//刪除pos位置的值 void SLErase(SL* ps, int pos) {assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];++begin;}ps->size--; }
?同理,這里也可以搭配SLFind使用:
int x;scanf("%d", &x);int pos = SLFind(&sl, x);if (pos != -1){SLErase(&sl, pos, x * 10);}SLPrint(&sl);SLDestroy(&sl);
?