[C语言]企业链表简单实现

企业链表-Linux内核链表优化简单实现

头文件:LinuxKernelList.h

#ifndef  LINUXKERNELLIST_H
#define LINUXKERNELLIST_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//链表指针节点
typedef struct LINUXNODE {
	struct LINUXNODE* next;
}LinuxNode;

//链表真正节点
typedef struct LINUXLIST {
	LinuxNode head;
	int size;
}LinuxList;

//遍历函数的指针
typedef void(*PRINTNODE)(LinuxNode*);
//比较函数的指针
typedef int(*COMPARENODE)(LinuxNode*, LinuxNode*);


//初始化链表
LinuxList* INIT_LINUXLIST();
//插入链表
void Insert_LinuxList(LinuxList* list, int pos, LinuxNode* data);
//删除链表
void Remove_LinuxList(LinuxList* list, int pos);
//查找链表元素
int Find_LinuxList(LinuxList* list, LinuxNode* data ,COMPARENODE compare);
//返回链表大小
int Size_LinuxList(LinuxList* list);
//打印链表
void Print_LinuxList(LinuxList* list, PRINTNODE print);
//释放链表内存
void FreeSpace_LinuxList(LinuxList* list);


#endif // ! LINUXKERNELLIST_H


实现文件:LinuxKernelList.c

#include "LinuxKernelList.h"


//初始化链表
LinuxList* INIT_LINUXLIST() {
	LinuxList* list = (LinuxList*)malloc(sizeof(LinuxList));
	list->head.next = NULL;
	list->size = 0;
	return list;
}
//插入链表
void Insert_LinuxList(LinuxList* list, int pos, LinuxNode* data) {
	if (list == NULL) {
		return;
	}
	if (data == NULL) {
		return;
	}
	if (pos<0 || pos>list->size) {
		pos = list->size;
	}
	//查找插入位置
	LinuxNode* pCurrent = &(list->head);
	for (int i = 0; i < pos; i++) {
		pCurrent = pCurrent->next;
	}
	//插入新节点
	data->next = pCurrent->next;
	pCurrent->next = data;
	list->size++;
}
//删除链表
void Remove_LinuxList(LinuxList* list, int pos) {
	if (list == NULL) {
		return;
	}
	if (pos<0 || pos>list->size) {
		pos = list->size;
	}
	//查找删除位置
	LinuxNode* pCurrent = &(list->head);
	for (int i = 0; i < pos; i++) {
		pCurrent = pCurrent->next;
	}
	//删除节点
	pCurrent->next = pCurrent->next->next;
	//因为我们并没有在节点里分配内存,数据信息储存在链表的其他域内,所以我们在删除时也不需要释放内存
	list->size--;

}
//查找链表元素
int Find_LinuxList(LinuxList* list, LinuxNode* data, COMPARENODE compare) {
	if (list == NULL) {
		return-1;
	}
	if (data == NULL) {
		return-1;
	}
	//辅助指针
	LinuxNode* pCurrent = list->head.next;
	int index = 0;
	int flag = -1;  //用于判断是否查找到了目标值
	//如果查找到了就将index 赋给flag
	//如果没查找到,就将flag=-1返回
	while (pCurrent != NULL) {
		if (compare(pCurrent, data)==0) {
			flag = index;
			break;
		}
		pCurrent = pCurrent->next;
		index++;
	}
	return flag;
}
//返回链表大小
int Size_LinuxList(LinuxList* list) {
	return list->size;
}
//打印链表
void Print_LinuxList(LinuxList* list, PRINTNODE print) {
	if (list == NULL) {
		return;
	}
	//辅助指针
	LinuxNode* pCurrent = list->head.next;
	while (pCurrent != NULL) {
		print(pCurrent);
		pCurrent = pCurrent->next;
	}


}
//释放链表内存
void FreeSpace_LinuxList(LinuxList* list) {
	if (list == NULL) {
		return;
	}
	free(list);
}

主文件:Main.c

typedef struct  PERSON_2{
	LinuxNode node;  //加入结构体作为连接多组数据的桥梁
	/*
	这里巧妙之处在于把node放到MyData结构体首地址的位置
	这样在定初始化一个MyData结构体后
	只需要利用强制类型转换就可以获得结构体首地址
	需要利用元素时,只需要将地址强制转换回结构体类型即可
	MyData data1;
	LinuxNode* node=(LinuxNode*) &data1;
	MyData data2=(MyData) node;
	*/
	char name[64];
	int age;
}Person_2;

//打印方式
void MyPrint2(LinuxNode*data) {
	Person_2* p = (Person_2*)data;
	printf("姓名:%-10s 年龄:%-10d\n", p->name, p->age);
}

//比较方式
int MyCompare(LinuxNode* pCurrent,LinuxNode*data) {
	Person_2* p1 = (Person_2*)pCurrent;
	Person_2* p2 = (Person_2*)data;
	if (strcmp(p1->name , p2->name)==0 && p1->age==p2->age) { 
		//当姓名年龄都一样时,才返回0
		return 0;
	}
	return -1;

}


void LinuxListTest() {
	/*企业链表操作*/
	//创建链表
	LinkList* list = INIT_LINUXLIST();
	//创建数据
	Person_2 p1, p2, p3, p4, p5;
	strcpy(p1.name, "Tom");
	strcpy(p2.name, "Bob");
	strcpy(p3.name, "Lili");
	strcpy(p4.name, "Bryan");
	strcpy(p5.name, "Hugo");
	p1.age = 45;
	p2.age = 16;
	p3.age = 65;
	p4.age = 19;
	p5.age = 26;
	//将节点插入链表
	Insert_LinuxList(list, 0, (LinuxNode*)&p1);
	Insert_LinuxList(list, 0, (LinuxNode*)&p2);
	Insert_LinuxList(list, 0, (LinuxNode*)&p3);
	Insert_LinuxList(list, 0, (LinuxNode*)&p4);
	Insert_LinuxList(list, 0, (LinuxNode*)&p5);
	//打印链表
	Print_LinuxList(list, MyPrint2);
	//删除节点
	printf("------------------------\n");
	Remove_LinuxList(list, 2);
	Print_LinuxList(list, MyPrint2);
	//查找
	Person_2 p6;
	strcpy(p6.name, "Bob");
	p6.age = 16;
	int index = Find_LinuxList(list, (LinuxNode*)&p6, MyCompare);
	printf("------------------------\n");
	printf("链表中存在这个人,他的索引是:%d\n", index);
	//释放链表内存
	FreeSpace_LinuxList(list);

}

int main(){
    LinuxListTest();
    system("pause");
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值