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

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

空間在一開始的時(shí)候就已經(jīng)開好,是定長數(shù)組。
一般情況下,我們不使用靜態(tài)的,因?yàn)榘盐詹蛔〉降组_辟多大的空間,你把握不住啊,兄弟哈哈哈
動(dòng)態(tài)順序表:使用動(dòng)態(tài)開辟的數(shù)組存儲(chǔ)。?
?
?存儲(chǔ)數(shù)據(jù)的數(shù)組空間是根據(jù)需求動(dòng)態(tài)開辟的。
接口實(shí)現(xiàn)
靜態(tài)順序表只適用于確定知道需要存多少數(shù)據(jù)的場景。靜態(tài)順序表的定長數(shù)組導(dǎo)致 N 定大了,空
間開多了浪費(fèi),開少了不夠用。所以現(xiàn)實(shí)中基本都是使用動(dòng)態(tài)順序表,根據(jù)需要?jiǎng)討B(tài)的分配空間
大小,所以下面我們實(shí)現(xiàn)動(dòng)態(tài)順序表。
//動(dòng)態(tài)順序表
typedef int SLDataType;typedef struct SeqList
{SLDataType* a;int size; //存儲(chǔ)有效數(shù)據(jù)個(gè)數(shù)int capacity; //空間大小
}SL;
在調(diào)用接口函數(shù)的時(shí)候,這里我們需要注意的是:形參是實(shí)參的拷貝,形參的改變不會(huì)影響實(shí)參。
?
在順序表進(jìn)行插入操作的時(shí)候,有時(shí)候空間需要擴(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);}}
?
?我們這里來舉個(gè)例子:
int main() {//SL sl;//SLInit(&sl);int* p1 = (int*)malloc(12);int* p2 = realloc(p1, 20);printf("%p,%p\n", p1, p2);return 0; }
?
?很顯然上面展示的是原地?cái)U(kuò)容,那我們接下來試一個(gè)大一點(diǎn)的:
int main() {//SL sl;//SLInit(&sl);int* p1 = (int*)malloc(12);int* p2 = realloc(p1, 200);printf("%p,%p\n", p1, p2);return 0; }
?
很顯然是異地?cái)U(kuò)容。?
在進(jìn)行尾刪操作的時(shí)候,我們要進(jìn)行檢測,這個(gè)時(shí)候呢分為兩種方式:
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);// 挪動(dòng)數(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:頭插挪動(dòng)數(shù)據(jù)的時(shí)候是從后往前挪
?頭刪:?
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);
?