18.1顺序表

该博客介绍了顺序表的数据结构及其C语言实现,包括初始化、获取大小、判断空、尾部插入、删除、查找等操作。此外,还提供了一个回调函数`transform`用于对表中元素进行操作。在`main.c`中展示了如何使用这些功能,如插入数据、打印所有元素、删除元素等。
摘要由CSDN通过智能技术生成

 

seqList.h

#pragma once
#include<stdbool.h>
#define INIT_SEQLIST_SIZE 8	//顺序表初始大小
typedef int Data;			//抽象数据类型ADT

//数组 容量(最多能存储多少个元素) 当前大小
typedef struct SeqList	//顺序表结构
{
	Data* base;		//指向动态内存分配的数组的指针
	int capacity;	//容量
	int size;		//当前元素个数
}SeqList;

//初始化顺序表
void initList(SeqList*list);

//获取大小
int size(SeqList* list);

//是否为空
bool empty(SeqList* list);

//尾部插入
void push_back(SeqList* list,const Data* const pval);

//删除最后一个元素
void pop_back(SeqList* list);
//删除指定的元素
void removeOne(SeqList* list, const Data* const pval);

//查找元素,返回下标
int find_pos(SeqList* list, const Data* const pval);
//查找元素,返回元素地址
Data* find_val(SeqList* list, const Data* const pval);


//回调登记函数
typedef void (*CallBack)(Data* pval);
void transform(SeqList* list, CallBack dosomething);

seqList.c

#include"seqList.h"
#include<malloc.h>
#include<stdio.h>
void initList(SeqList* list)
{
	list->capacity = INIT_SEQLIST_SIZE;
	list->size = 0;
	list->base = (Data*)calloc(list->capacity, sizeof(Data));
	if (!list)
	{
		puts("内存申请失败~");
		return;
	}
}

int size(SeqList* list)
{
	return list->size;
}

bool empty(SeqList* list)
{
	return list->size == 0;
}

void push_back(SeqList* list, const Data* const pval)
{
	//判断顺序表有没有位置(是否已满)
	if (list->size == list->capacity)
	{
		puts("顺序表已满,无法插入~");
		return;
	}
	list->base[list->size] = *pval;	//插入
	list->size++;					//元素个数加1
}

void pop_back(SeqList* list)
{
	if(!empty(list))
		list->size--;
}

void removeOne(SeqList* list, const Data* const pval)
{
	if (empty(list))	//为空直接返回,无需删除
		return;
	//先找到pval,需要下标还是元素地址
	int delPos =  find_pos(list, pval);
	if (delPos == -1)
	{
		return;
	}
	//开始删除元素(把要删除的元素后面的元素都往前挪动)
	for (int i = delPos; i < list->size-1 ; i++)
	{
		list->base[i] = list->base[i + 1];
	}
	//size-1
	list->size--;
}

int find_pos(SeqList* list, const Data* const pval)
{
	for (int i = 0; i < list->size; i++)
	{
		if (list->base[i] == *pval)
		{
			return i;
		}
	}
	return -1;
}

Data* find_val(SeqList* list, const Data* const pval)
{
	for (int i = 0; i < list->size; i++)
	{
		if (list->base[i] == *pval)
		{
			return list->base + i;
		}
	}
	return NULL;
}

void transform(SeqList* list, CallBack dosomething)
{
	for (int i = 0; i < list->size; i++)
	{
		dosomething(list->base + i);
	}
}

main.c

#include<stdio.h>
#include"seqList.h"
/*
* 顺序表:线性表的一种,每个元素都是连续的,内存连续(数组)
* 
*/                    

void print(Data* pval)
{
	printf("%d ",*pval);
}

int main()
  {
	SeqList list = {0};
	initList(&list);

	//插入数据
	for (int i = 0; i < list.capacity; i++)
	{
		push_back(&list, &i);
	}

	//输出所有元素
	transform(&list, print);

	//删除元素
	pop_back(&list);
	int len = list.size;
	for (int i = 0; i < len; i++)
	{
		pop_back(&list);
		//removeOne(&list, &i);
	}
	

	printf("\n");
	transform(&list, print);



	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值