> 文章列表 > 顺序表的实现

顺序表的实现

顺序表的实现

思维导图:

一,顺序

一,顺序表的创建(位置:头文件内)

1.1顺序表的结构体类型

要求:创建顺序表并使这个顺序表能够存放数据,能记录有效数据的个数,能够记录容量大小。

 代码

#define data int
typedef struct SL {data* Data;int sz;int capacity;
}SL;

这里还使用了typedef来对结构体类型进行重命名,可以方便使用这种结构体类型。

使用(测试文件内):

SL a;

2.初始化(SL.c文件内)

代码:

void SlInit(SL* a) {a->Data = (data*)malloc(sizeof(data) * 4);if (a->Data == NULL) {perror("malloc fail");return;}a->sz = 0;a->capacity = 4;
}

!!!初始化是非常必要的

3.容量检查(SL.c文件内)

!  !  !  检查容量避免越界 

void SlCheak(SL* a) {if (a->sz == a->capacity) {data* temp = (data*)realloc(a->Data,sizeof(data)*2*(a->capacity));if (temp == NULL) {perror("malloc fail\\n");return;}a->Data = temp;a->capacity = 2 * (a->capacity);}
}

 4.插入与删除函数

前插,尾插,前删,尾删,中间插入,中间删除

1.在这里,先分别写一个中间插入与删除的函数:

 中间插入函数:SLInsert()

参数SL*a,int pos,int n

代表:要插入的顺序表,插入位置,插入的值

代码:

void SlInsert(SL* a, int pos, int n) {assert(pos > 0 && pos < a->sz);SlCheak(a);pos = pos - 1;int i = a->sz-1;while (i >= pos) {a->Data[i + 1] = a->Data[i];i--;}a->Data[pos] = n;a->sz++;
}

中间删除函数:SLErase()

参数SL*a  , int pos

代表:顺序表,要删除的数的下标

代码:

void SlErase(SL* a, int pos) {assert(pos > 0 && pos < a->sz);SlCheak(a);pos = pos - 1;int i = 0;for (i = pos;i < a->sz-1;i++) {a->Data[i] = a->Data[i + 1];}a->sz--;
}

其实,尾插头插,尾删头删都可以复用中间插入中间删除来实现。在这里交给各位读者来想想了。

四,查找数据

SLFind()

在这里使用的了一个static修饰的函数Find()来寻找要查找的数据的位置。这个函数也可以复用来实现Modify()函数 

static int Find(SL* a, int taget) {assert(a);int i = 0;for (i = 0;i < a->sz;i++) {if (a->Data[i] == taget) {return i;}}return -1;
}
void SlFind(SL* a) {assert(a);printf("请输入你要查找的数据:>");int taget = 0;scanf("%d", &taget);if (Find(a, taget)>=0) {printf("找到了,下标是:>%d\\n", Find(a, taget));}else {printf("找不到……\\n");}
}

五,修改数据

Modify()

void SlModify(SL* a) {assert(a);printf("请输入你要修改的对象:>");int n = 0;scanf("%d", &n);int pos = Find(a, n);//复用if (pos == -1) {printf("这个值不存在\\n");}else {printf("请输入你要修改的值:>");int j = 0;scanf("%d", &j);a->Data[pos] = j;}}