- 链表推演
- 企业链表思路图
- 企业链表框架
// 链表小结点
typedef struct LINKNODE {
struct LINKNODE* next;
}LinkNode;
// 链表大结点
typedef struct LINKLIST {
LinkNode head;
int size;
}LinkList;
- 企业链表声明
// 遍历函数指针
typedef void(*PRINTNODE)(LinkNode*);
// 比较函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*);
// 初始化链表
LinkList* Init_LinkList();
// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data);
// 删除
void Remove_LinkList(LinkList* list, int pos);
// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE print);
// 返回链表大小
int Size_LinkList(LinkList* list);
// 打印
void Print_LinkList(LinkList* list, PRINTNODE print);
// 释放链表内存
void FreeSpace_LinkList(LinkList* list);
- 企业链表实现
// 初始化链表
LinkList* Init_LinkList() {
LinkList* list = (LinkList*)malloc(sizeof(LinkList));
list->head.next = NULL;
list->size = 0;
return list;
}
// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data) {
if (list == NULL) return;
if (data == NULL) return;
if (pos <0 || pos >list->size) pos = list->size;
// 查找插入位置
LinkNode* pCurrent = &(list->head); // 头结点
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
// 插入新结点
data->next = pCurrent->next;
pCurrent->next = data;
// 更新长度
list->size++;
}
// 删除
void Remove_LinkList(LinkList* list, int pos) {
if (list == NULL) return;
if (pos < 0 || pos > list->size) return;
// 辅助指针变量
LinkNode* pCurrent = &(list->head);
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
// 删除结点
pCurrent->next = pCurrent->next->next;
// 更新长度
list->size--;
}
// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare) {
int pos = -1;
if (list == NULL) return pos;
if (data == NULL) return pos;
// 辅助指针变量
LinkNode* pCurrent = &(list->head);
int index = -1;
while (pCurrent != NULL) {
if (compare(pCurrent, data) == 0) {
pos = index;
break;
}
pCurrent = pCurrent->next;
index++;
}
return pos;
}
// 返回链表大小
int Size_LinkList(LinkList* list) {
return 0;
}
// 打印
void Print_LinkList(LinkList* list, PRINTNODE print) {
if (list == NULL) return;
// 放的是 LinkNode* 结点
// 辅助指针
LinkNode* pCurrent = list->head.next; // 头节点下一个
while (pCurrent != NULL) {
print(pCurrent);
pCurrent = pCurrent->next;
}
}
// 释放链表内存
void FreeSpace_LinkList(LinkList* list) {
if (list == NULL) return;
free(list);
}
- 测试代码
typedef struct PERSON {
LinkNode node; // 相当于 next
char name[64];
int age;
}Person;
void MyPrint(LinkNode* data) {
Person* p = (Person*)data; // 转化回去
printf("name: %s age: %d\n", p->name, p->age);
}
int MyCompare(LinkNode* data1, LinkNode* data2) {
Person* val1 = (Person*)data1; // 转化
Person* val2 = (Person*)data2;
if (strcmp(val1->name, val2->name)== 0 && val1->age == val2->age) {
return 0;
}
else return -1;
}
void test01() {
// 创建链表
LinkList* list = Init_LinkList();
// 创建数据
Person p1, p2, p3, p4, p5;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
strcpy(p4.name, "ddd");
strcpy(p5.name, "eee");
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50;
// 将结点插入到链表
Insert_LinkList(list, 0, (LinkNode*)&p1);
Insert_LinkList(list, 0, (LinkNode*)&p2);
Insert_LinkList(list, 0, (LinkNode*)&p3);
Insert_LinkList(list, 0, (LinkNode*)&p4);
Insert_LinkList(list, 0, (LinkNode*)&p5); // pos = 0 相当头插
// 删除
Remove_LinkList(list, 1); // p4 被删除
// 打印
Print_LinkList(list, MyPrint);
// 查找
Person find_p;
strcpy(find_p.name, "aaa");
find_p.age = 10;
Person find_p2;
strcpy(find_p2.name, "eee");
find_p2.age = 50;
int pos = Find_LinkList(list, (LinkNode*)&find_p2, MyCompare);
printf("find_p pos = %d", pos); // 0
// 销毁
FreeSpace_LinkList(list);
}
运行结果: