考研顺序表的初始化、销毁、打印、封装、增删改查代码看这一篇就够了

目录

题目

头文件:

[SeqList.c 文件](#SeqList.c 文件)

销毁函数

封装函数,动态扩容

尾插法

打印函数

头插法

尾删法

头删法

指定位置插入

指定下标位置删除

按值查找下标

Test.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();
}
相关推荐
yuanManGan24 分钟前
数据结构漫游记:静态链表的实现(CPP)
数据结构·链表
罗伯特祥26 分钟前
C调用gnuplot绘图的方法
c语言·plot
嵌入式科普1 小时前
嵌入式科普(24)从SPI和CAN通信重新理解“全双工”
c语言·stm32·can·spi·全双工·ra6m5
火星机器人life1 小时前
基于ceres优化的3d激光雷达开源算法
算法·3d
虽千万人 吾往矣2 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划
arnold662 小时前
华为OD E卷(100分)34-转盘寿司
算法·华为od
ZZTC3 小时前
Floyd算法及其扩展应用
算法
lqqjuly3 小时前
特殊的“Undefined Reference xxx“编译错误
c语言·c++
lshzdq3 小时前
【机器人】机械臂轨迹和转矩控制对比
人工智能·算法·机器人
2401_858286114 小时前
115.【C语言】数据结构之排序(希尔排序)
c语言·开发语言·数据结构·算法·排序算法