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

目录

题目

头文件:

[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();
}
相关推荐
哭泣的眼泪40819 分钟前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
清炒孔心菜29 分钟前
每日一题 LCR 078. 合并 K 个升序链表
leetcode
Microsoft Word1 小时前
c++基础语法
开发语言·c++·算法
天才在此1 小时前
汽车加油行驶问题-动态规划算法(已在洛谷AC)
算法·动态规划
莫叫石榴姐2 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
茶猫_3 小时前
力扣面试题 - 25 二进制数转字符串
c语言·算法·leetcode·职场和发展
ö Constancy4 小时前
Linux 使用gdb调试core文件
linux·c语言·vim
lb36363636364 小时前
介绍一下strncmp(c基础)
c语言·知识点
wellnw4 小时前
[linux] linux c实现共享内存读写操作
linux·c语言
Hera_Yc.H4 小时前
数据结构之一:复杂度
数据结构