文章目录
提示:个人学习记录,日后复习 仅供参考
一、顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表:可动态增长的数组,要求数据是连续存储的
二、顺序表定义
动态顺序表
typedef int SeqListDataType;
typedef struct SeqList {
SeqListDataType* arr; //动态开辟的数据
int size; //有效数据个数
int capacity; //容量
}SeqList;
工程结构
博主使用的是VS2019

SeqList.h:头文件的引用,顺序表的定义,接口声明
SeqList.c:顺序表接口的实现
test.c:主函数,测试接口
顺序表头文件代码SeqList.h如下
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int SeqListDataType;
typedef struct SeqList {
SeqListDataType* arr;
int size;
int capacity;
}SeqList;
//初始化
void SeqListInit(SeqList* ps);
//销毁
void SeqListDestory(SeqList* ps);
//扩容
void BuySeqList(SeqList*ps);
//尾插
void SeqListPushBack(SeqList*ps, SeqListDataType x);
//尾删
void SeqListPopBack(SeqList *ps);
//头插
void SeqListPushFront(SeqList* ps, SeqListDataType x);
//头删
void SeqListPopFront(SeqList* ps);
//遍历
void SeqListPrint(SeqList * ps);
//指定位置插
void SeqListInsert(SeqList * ps ,int pos, SeqListDataType x);
//指定位置删
void SeqListErase(SeqList* ps, int pos);
//修改指定下标位置值
void SeqListModify(SeqList* ps, int pos, SeqListDataType x);
//查找指定值,返回下标
int SeqListFind(SeqList * ps ,SeqListDataType x);
//查看数据个数
int SeqListSize(SeqList * ps);
三、接口实现(增删改查)
1.初始化顺序表
//初始化
void SeqListInit(SeqList* ps) {
assert(ps);
ps->arr = (SeqListDataType*)malloc(sizeof(SeqListDataType)*4);
ps->size = 0;
ps->capacity = 4;
};
2.销毁顺序表
//销毁
void SeqListDestory(SeqList* ps) {
ps->capacity = 0;
ps->size = 0;
free(ps->arr);
};
3.遍历顺序表(打印)
//遍历
void SeqListPrint(SeqList* ps) {
int size = 0;
for(size = 0; size < ps->size; size++) {
printf("%d ",ps->arr[size]);
}
printf("\n");
};
4.扩容
//扩容
void BuySeqList(SeqList* ps) {
assert(ps);
if (ps->size>=ps->capacity) {
ps->capacity *= 2;
SeqListDataType* size = (SeqListDataType*)realloc(ps->arr,sizeof(SeqListDataType)*ps->capacity);
if (size==NULL) {
perror("realloc");
return;
}
ps->arr = size;
}
};
5.顺序表尾插
//尾插
void SeqListPushBack(SeqList* ps, SeqListDataType x) {
assert(ps);
BuySeqList(ps);
ps->arr[ps->size] = x;
ps->size++;
};
6.顺序表尾删
//尾删
void SeqListPopBack(SeqList* ps) {
assert(ps);
ps->size--;
};
7.顺序表头插
//头插
void SeqListPushFront(SeqList* ps, SeqListDataType x) {
assert(ps);
BuySeqList(ps);
int size = ps->size;
while (size--) {
ps->arr[size+1] = ps->arr[size ];
}
//以上循环执行完,size是-1
ps->arr[size+1] = x;
ps->size++;
};
8.顺序表头删
//头删
void SeqListPopFront(SeqList* ps) {
assert(ps);
int size = 0;
for (size = 0; size < ps->size - 1;size++) {
ps->arr[size] = ps->arr[size + 1];
}
ps->size--;
};
9.指定位置插入数据
//指定位置插
void SeqListInsert(SeqList* ps, int pos,SeqListDataType x) {
assert(ps);
assert(pos>=0 && pos<=ps->size);
BuySeqList(ps);
int size = ps->size;
while (size>pos-1) {
ps->arr[size] = ps->arr[size - 1];
size--;
}
ps->arr[size] = x;
ps->size++;
};
10.指定位置删除数据
//指定位置删
void SeqListErase(SeqList* ps, int pos) {
assert(ps);
int size = pos - 1;
for (size; size < ps->size; size ++) {
ps->arr[size] = ps->arr[size + 1];
}
ps->size--;
};
11.指定位置修改数据
//修改指定下标位置值
void SeqListModify(SeqList* ps, int pos, SeqListDataType x) {
assert(ps);
assert(pos>=0&&pos<=ps->size);
ps->arr[pos] = x;
};
12.返回顺序表有效数据个数
//查看数据个数
int SeqListSize(SeqList* ps) {
assert(ps);
return ps->size;
};
13.查找指定数据(返回下标)
//查找指定值,返回下标
int SeqListFind(SeqList* ps, SeqListDataType x) {
assert(ps);
int size = 0;
for (size; size < ps->size;size++) {
if (ps->arr[size]==x) {
return size;
}
}
return -1; //没找到
};
2008

被折叠的 条评论
为什么被折叠?



