合肥市門窗工程在哪個網(wǎng)站接活做百度seo點擊工具
數(shù)據(jù)結構——順序表的實現(xiàn)
- 一 關于順序表的簡單知識
- 二 動態(tài)順序表
一 關于順序表的簡單知識
1.順序表的底層結構是數(shù)組,在數(shù)組的基礎上增加了增,刪,查,改等方法。
2.順序表的分類:靜態(tài)順序表和動態(tài)順序表
靜態(tài)順序表的缺陷:給小了,空間不夠;給大了,造成空間浪費。
動態(tài)順序表:可以實現(xiàn)動態(tài)增容(成倍數(shù)的增加,一般成二倍的形式增加)
3.順序表是線性表的一種,在物理結構和邏輯結構上都是線性的。
二 動態(tài)順序表
由于靜態(tài)順序表的不靈活性,所以一般使用動態(tài)順序表,接下來,我主要給大家講解動態(tài)順序表。
但是,在此之前,我還是把靜態(tài)順序表給大家講清楚。
#define N 100;//添加宏定義,可以更容易的更改底層數(shù)組大小
struct SeqList
{int arr[N];//靜態(tài)順序表底層結構是一個固定大小的數(shù)組,由此造成了它的不靈活性int size;//有效數(shù)據(jù)長度}
接下來,就是動態(tài)順序表了。
動態(tài)順序表的頭文件
#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
//定義順序表
typedef int SLDateList;
typedef struct SeqList
{SLDateList* arr;//由于動態(tài)順序表不知道數(shù)組的大小,所以使用指針。int size;int capacity;}SL;//初始化
void SLInit(SL* ps);//銷毀
void SLDestory(SL* ps);//尾插
void SLPushBack(SL* ps, SLDateList x);
//頭插
void SLPushFront(SL* ps, SLDateList x);
//尾刪
void SLPopBack(SL* ps);
//頭刪
void SLPopFront(SL* ps);
//打印
void SLPrint(SL ps);
//查找
int SLFind(SL* ps, SLDateList x);
//在指定位置插入數(shù)據(jù)
void SLInit(SL* ps, SLDateList pos, SLDateList x);
//在指定位置刪除數(shù)據(jù)
void SLErase(SL* ps, SLDateList pos);
動態(tài)順序表的源文件
#include"SE.h"void SLInit(SL * ps)
{ps->arr = NULL;ps-> size = ps-> capacity = 0;}
//頭插,尾插都要判斷順序表是否為空
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//注意是相等,不是賦值SLDateList* tmp = (SLDateList*)realloc(ps->arr, newcapacity * sizeof(SLDateList));if (tmp == NULL){perror("realloc file!");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}void SLPushBack(SL* ps, SLDateList x)
{assert(ps);//順序表不能傳空SLCheckCapacity(ps);ps->arr[ps->size++] = x;}void SLPushFront(SL* ps, SLDateList x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i-1];}ps->arr[0] = x;ps->size++;}void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);--ps->size;
}void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);for (int i = ps->size; i<ps->size-1; i--){ps->arr[i] = ps->arr[i + 1];}ps->size--;}void SLPrint(SL ps)
{for (int i = 0; i < ps.size; i++){printf("%d",ps.arr[i]);}printf("\n");
}int SLFind(SL* ps, SLDateList x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;}elsereturn -1;}
}
void SLInit(SL* ps, SLDateList pos, SLDateList x)
{assert(ps);assert(pos>=0 && pos<=ps->size);SLCheckCapacity(ps);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;}
void SLErase(SL* ps, SLDateList pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);for (int i = pos ; i<ps->size-1; i++){ps->arr[i - 1] = ps->arr[i];//size-2 = size-1}ps->size--;
}void SLDestory(SL* ps)
{if (ps->arr)//銷毀誰,銷毀的是已經申請過空間的數(shù)組{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;}