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

目录

题目

头文件:

[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();
}
相关推荐
丫头,冲鸭!!!8 分钟前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚12 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
~yY…s<#>1 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
幸运超级加倍~2 小时前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划
埃菲尔铁塔_CV算法3 小时前
人工智能图像算法:开启视觉新时代的钥匙
人工智能·算法
EasyCVR3 小时前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
linsa_pursuer3 小时前
快乐数算法
算法·leetcode·职场和发展