前言
这是我对于数据结构顺序表的增删查改理解以及代码实现
首先分为三个文件。

一、Seqlist.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h>
typedef int SLDateType;
typedef struct SeqList { SLDateType* a; size_t size; size_t capacity; }SeqList; void SeqListInit(SeqList* ps); void SeqListDestory(SeqList* ps);
void SeqListPrint(SeqList* ps); void SeqListPushBack(SeqList* ps, SLDateType x); void SeqListPushFront(SeqList* ps, SLDateType x); void SeqListPopFront(SeqList* ps); void SeqListPopBack(SeqList* ps);
int SeqListFind(SeqList* ps, SLDateType x);
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
void SeqListErase(SeqList* ps, size_t pos);
|
二、函数功能的实现(Seqlist.c)
1.顺序表在pos位置插入 (SeqListInsert)
注意size_t是无符号整形,-1为111111111111111111111111111111111111
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void SeqListInsert(SeqList* ps, size_t pos, SLDateType x) { assert(ps); if (pos > ps->size) { printf("pos越界了%d\n",pos); return; } SeqListCheckCapacity(ps);
size_t end = ps->size; while (end > pos) { ps->a[end] = ps->a[end - 1]; --end; } ps->a[pos] = x; ps->size++; }
|
2.头插(在pos=0处插入)
代码如下:
1 2 3 4 5 6
| void SeqListPushFront(SeqList* ps, SLDateType x) { assert(ps); SeqListInsert(ps, 0, x); }
|
3.尾插(在pos=size处插入)
代码如下:
1 2 3 4 5 6
| void SeqListPushBack(SeqList* ps, SLDateType x) { assert(ps); SeqListInsert(ps, ps->size, x); }
|
4. 顺序表在pos位置删除
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void SeqListErase(SeqList* ps, size_t pos) { assert(ps); if (pos > ps->size) { printf("越界了\n"); return; } size_t begin = pos+1; while(begin < ps->size) { ps->a[begin-1] = ps->a[begin]; begin++; } if (ps->size > 0) { ps->size--; } }
|
5头删(在pos=0处删除)
1 2 3 4 5 6
| void SeqListPopFront(SeqList* ps) { assert(ps); SeqListErase(ps, 0); }
|
6.尾删(在pos=size-1处删除)
1 2 3 4 5 6
| void SeqListPopBack(SeqList* ps) { assert(ps); SeqListErase(ps, ps->size-1); }
|
7.销毁顺序表
1 2 3 4 5 6 7 8
| void SeqListDestory(SeqList* ps) { assert(ps); free(ps->a); ps->a = NULL; ps->size = ps->capacity = 0; }
|
8.查找数据所在位置
1 2 3 4 5 6 7 8 9 10 11 12 13
| int SeqListFind(SeqList* ps, SLDateType x) { int i = 0; for (i = 0; i < ps->size; i++) { if (ps->a[i] == x) { return i; } } return -1; }
|
9.初始化顺序表
1 2 3 4 5 6 7 8
| void SeqListInit(SeqList* ps) { assert(ps); ps->a = NULL; ps->capacity = 0; ps->size = 0; }
|
10.打印顺序表
1 2 3 4 5 6 7 8 9 10 11
| void SeqListPrint(SeqList* ps) { assert(ps); int i = 0; for (i = 0; i < ps->size; i++) { printf("%d ", ps->a[i]); } printf("\n"); }
|
11.检查空间够不够用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void SeqListCheckCapacity(SeqList* ps) { assert(ps); if (ps->size == ps->capacity) { size_t newCapacity = ps->capacity==0?4:ps->capacity*2; SLDateType* tmp = realloc(ps->a,sizeof(SLDateType)*newCapacity); if (tmp == NULL) { printf("realloc fail\n"); exit(-1); } else { ps->a = tmp; ps->capacity = newCapacity; } } }
|
总结
顺序表其实就是结构体里加了个数组(int*a)。