目录
[SeqList.c 文件](#SeqList.c 文件)
题目
// SeqList.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> typedef int SLDateType; typedef struct SeqList { SLDateType* a; int size; int capacity; }SeqList; // 对数据的管理:增删查改 void SeqListInit(SeqList* ps); void SeqListDestroy(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); // 顺序表在pos位置插入x void SeqListInsert(SeqList* ps, int pos, SLDateType x); // 顺序表删除pos位置的值 void SeqListErase(SeqList* ps, int pos);
头文件:
cpp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int SLDataType;
typedef struct SeqList {
SLDataType* a;
int size;
int capacity;
}SL;
void SLInit(SL* psl);
void SLDestory(SL* psl);
void SLPrint(SL* psl);
void SLPushBack(SL* psl, SLDataType x);
void SLCheckCapacity(SL* psl);
void SLPushFront(SL* psl, SLDataType x);
void SLPopBack(SL* psl);
void SLInsert(SL* psl, int pos, SLDataType x);
void SLErase(SL* psl, int pos);
int SLFind(SL* psl, SLDataType x);
SeqList.c 文件
cpp
#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include"assert.h"
//初始化
void SLInit(SL* psl) {
psl->a = NULL;
psl->size = 0;
psl->capacity = 0;
}
销毁函数
cpp
//销毁
void SLDestory(SL* psl) {
if (psl->a != NULL) {
free(psl->a);
psl->a = 0;
psl->size = 0;
psl->capacity = 0;
}
}
封装函数,动态扩容
1.先判满了,是否有效个数等于空间总数,如果等于判空间是否为空
2.空了的话,先给capacity赋初值为4,不为空则给空间动态扩容两倍
cpp
//封装函数
void SLCheckCapacity(SL* psl) {
assert(psl);
if (psl->size == psl->capacity) { //当空间满了,即数据个数等于容量
int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;//当容量为0的时候扩容也为0,所以当capacity==0时给他赋初值4个空间,不为0扩容两倍
SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * newcapacity);
if (tmp == NULL) { //如果扩容失败返回realloc fail
perror("realloc fail");
return 0;
}
psl->a = tmp; //用tmp接收的原因是,如果ralloc开辟失败,用psl->a接收会导致原始地址丢失
psl->capacity = newcapacity;
}
}
尾插法
cpp
//尾插
void SLPushBack(SL* psl,SLDataType x){
assert(psl);
SLCheckCapacity(psl);
psl->a[psl->size] = x;
psl->size++;
}
打印函数
for循环遍历一遍数组,并打印
cpp
//打印
void SLPrint(SL* psl) {
for (int i = 0; i < psl->size; i++) {
printf("%d ", psl->a[i]);
}
printf("\n");
}
头插法
cpp
//头插
void SLPushFront(SL* psl, SLDataType x) {
assert(psl);
SLCheckCapacity(psl);
int end = psl->size - 1;
while (end >= 0) {
psl->a[end + 1] = psl->a[end];
--end;
}
psl->a[0] = x;
psl->size++;
}
尾删法
cpp
//尾删
void SLPopBack(SL* psl) {
assert(psl);
/*if (psl->size == 0) {
return;
}*/
assert(psl->size> 0);
psl->size--;
}
头删法
cpp
//头删法
void SLPopFront(SL* psl) {
assert(psl);
int begin = 0;
while (begin <= psl->size - 1) {
psl->a[begin] = psl->a[begin+1];
++begin;
}
psl->size--;
}
指定位置插入
cpp
//指定下标位置插入
void SLInsert(SL* psl, int pos, SLDataType x) {
assert(psl);
assert(pos >= 0 && pos <= psl->size);
SLCheckCapacity(psl);
int end = psl->size - 1;
while (end >= pos) {
psl->a[end + 1] = psl->a[end];
--end;
}
psl->a[pos] = x;
psl->size++;
}
指定下标位置删除
cpp
void SLErase(SL* psl, int pos) {
assert(psl);
assert(pos>=0&&pos<psl->size);
int begin = pos + 1;
while (begin < psl->size) {
psl->a[begin - 1] = psl->a[begin];
++begin;
}
psl->size--;
}
按值查找下标
用for循环遍历一遍,如果i的值等于x则返回下标i;
cpp
//按值查找下标
int SLFind(SL* psl, SLDataType x) {
assert(psl);
for (int i = 0; i <= psl->size - 1; i++) {
if (psl->a[i] == x) {
return i;
}
}
return -1;
}
Test.c测试类
cpp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"SeqList.h"
void TestL1() {
SL sl; //SL是结构体名,sl是创建一个类,用来测试
SLInit(&sl);
SLPushBack(&sl, 1); //插入数据
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPushBack(&sl, 5);
SLPushBack(&sl, 6);
SLPushBack(&sl, 7);
SLPushBack(&sl, 8);
SLPushBack(&sl, 9);
SLPrint(&sl);
SLPushFront(&sl, 10);
SLPushFront(&sl, 20);
SLPushFront(&sl, 30);
SLPushFront(&sl, 40);
SLPrint(&sl);
SLPopBack(&sl);
SLPopBack(&sl);
SLPopBack(&sl);
SLPopBack(&sl);
SLPrint(&sl);
SLDestory(&sl);
}
void TestL2() {
SL sl; //SL是结构体名,sl是创建一个类,用来测试
SLInit(&sl);
SLPushBack(&sl, 1); //插入数据
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPushBack(&sl, 5);
SLPushBack(&sl, 6);
SLPushBack(&sl, 7);
SLPushBack(&sl, 8);
SLPushBack(&sl, 9);
SLPrint(&sl);
SLInsert(&sl, 2, 10);
SLPrint(&sl);
SLErase(&sl, 3);
SLPrint(&sl);
SLFind(&sl, 4);
SLPrint(&sl);
}
int main() {
TestL2();
}