数据结构泛化操作

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <string.h>
#include <stdarg.h>

/*
	不直接存储数据
	存储数据的地址--->万能指针
	数据遍历与解析--->回调思路实现
*/
typedef struct SqList
{
	void** data;
	int size;
	int maxSize;
}SqList;

SqList* Create()
{
	SqList* sqlist = (SqList*)calloc(1, sizeof(SqList));
	assert(sqlist);
	return sqlist;
}
typedef bool (*Compare)(void* one, void* two);
void Insert(SqList* sqlist, void* data, Compare func)
{
	//有序插入
	assert(sqlist);
	assert(data);
	if (sqlist->size == sqlist->maxSize)
	{
		sqlist->maxSize += 10;
		void** temp = (void**)realloc(sqlist->data, sizeof(void*) * sqlist->maxSize);
		assert(temp);
		sqlist->data = temp;
	}
	sqlist->data[sqlist->size] = data;
	for (int i = sqlist->size; i > 0; i--)
	{
		//二级指针存储的多个一级指针
		if (func(sqlist->data[i - 1], sqlist->data[i]))
		{
			void* temp = *(sqlist->data + i - 1);
			*(sqlist->data + i - 1) = *(sqlist->data + i);
			*(sqlist->data + i) = temp;
		}
		else
		{
			break;
		}
	}
	sqlist->size++;
}

typedef void(*Output)(void* data);
void PrintSqlist(SqList* sqlist, Output func)
{
	for (int i = 0; i < sqlist->size; i++)
	{
		func(sqlist->data[i]);
	}
	printf("\n");
}

//管理整数
bool CompareInt(void* one, void* two)
{
	return ((int*)one)[0] > ((int*)two)[0];
}

void PrintInt(void* a)
{
	printf("%d\t", *(int*)a);
}

void Test_Sqlist_Int()
{
	SqList* sqlist = Create();
	int a = 1;
	int b = 4;
	int c = 3;
	Insert(sqlist, &a, CompareInt);
	Insert(sqlist, &b, CompareInt);
	Insert(sqlist, &c, CompareInt);
	PrintSqlist(sqlist, PrintInt);
}
//管理自定义类型数据
typedef struct Stu
{
	char name[20];
	int age;
	int num;
}Stu;
bool CompareAge(void* one, void* two)
{
	return ((Stu*)one)->age > ((Stu*)two)->age;
}

bool CompareNum(void* one, void* two)
{
	return ((Stu*)one)->num > ((Stu*)two)->num;
}

void PrintStu(void* a)
{
	Stu* temp = (Stu*)a;
	printf("%s\t%d\t%d\n", temp->name, temp->age, temp->num);
}
void Test_Sqlist_Stu()
{
	SqList* sqlist = Create();
	Stu a = { "3小美",19,1002 };
	Stu b = { "2小花",39,1001 };
	Stu c = { "1小芳",29,1003 };
	Insert(sqlist, &a, CompareAge);
	Insert(sqlist, &b, CompareAge);
	Insert(sqlist, &c, CompareAge);
	PrintSqlist(sqlist, PrintStu);

	SqList* sqlist2 = Create();
	Insert(sqlist2, &a, CompareNum);
	Insert(sqlist2, &b, CompareNum);
	Insert(sqlist2, &c, CompareNum);
	PrintSqlist(sqlist2, PrintStu);

}
int main()
{
	Test_Sqlist_Int();
	Test_Sqlist_Stu();
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值