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

目录

题目 

头文件:

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);

头文件:

#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 文件

#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include"assert.h"
//初始化
void SLInit(SL* psl) {
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}



 销毁函数

//销毁
void SLDestory(SL* psl) {
	if (psl->a != NULL) {
		free(psl->a);
		psl->a = 0;
		psl->size = 0;
		psl->capacity = 0;
	}
}

 封装函数,动态扩容

1.先判满了,是否有效个数等于空间总数,如果等于判空间是否为空

2.空了的话,先给capacity赋初值为4,不为空则给空间动态扩容两倍

//封装函数
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;
	}
}

尾插法 

//尾插
void SLPushBack(SL* psl,SLDataType x){
	assert(psl);
	SLCheckCapacity(psl);
	psl->a[psl->size] = x;
	psl->size++;
}

 

 打印函数

for循环遍历一遍数组,并打印

//打印
void SLPrint(SL* psl) {
	for (int i = 0; i < psl->size; i++) {
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}

 头插法

//头插
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++;
}

 尾删法

//尾删
void SLPopBack(SL* psl) {
	assert(psl);
	/*if (psl->size == 0) {
		return;
	}*/
	assert(psl->size> 0);
	psl->size--;
	

}

 

头删法

 

//头删法
void SLPopFront(SL* psl) {

	assert(psl);
	int begin = 0;
	while (begin <= psl->size - 1) {
		psl->a[begin] = psl->a[begin+1];
		++begin;
	}
	psl->size--;

}

指定位置插入

//指定下标位置插入
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++;
}

 

指定下标位置删除 

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;

//按值查找下标
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测试类

#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();
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值