#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;
}
数据结构泛化操作
最新推荐文章于 2024-08-08 17:03:13 发布