企业链表

企业链表即传统链表的改造,把每个链表的结点指针相连接在一起
LinkList.h头文件定义一些链表常用的API

#ifndef LINKLIST_H
#define LINKLIST_H

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 Size_LinkList(LinkList* list);
//查找
int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare);
//打印链表结点
void Print_LinkList(LinkList* list,PRINTNODE print);
//释放链表内存
void FreeSpace_LinkList(LinkList* list);


#endif

LinkList.cpp文件实现头文件中定义的函数

#include"LinkList.h"
#include<stdlib.h>
#include<stdio.h>


//初始化链表
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;
	//如果位置pos越界
	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 Size_LinkList(LinkList* list)
{
	return list->size;
}
//查找
int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare)
{
	if(list==NULL)
		return -1;
	if(data=NULL)
		return -1;
	//找结点,并创建辅助结点
	LinkNode* pCurrent=list->head.next;
	int index=0;
	while(pCurrent!=NULL)
	{
		if(compare(pCurrent,data)==0)
		{
			break;
		}
		pCurrent=pCurrent->next;
		index++;
	}
	return index;
}
//打印链表结点
void Print_LinkList(LinkList* list,PRINTNODE print)
{
	if(list==NULL)
		return;
	//辅助指针
	LinkNode* pCurrent=list->head.next;
	while(pCurrent!=NULL)
	{
		pCurrent=pCurrent->next;
		print(pCurrent);
	}
}
//释放链表内存
void FreeSpace_LinkList(LinkList* list)
{
	if(list==NULL)
		return;
	free(list);
}

测试

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"LinkList.h"
typedef struct MYDATA
{
	LinkNode node;
	char name[64];
	int age;
}MyData;

void MyPrint(LinkNode* data)
{
	MyData* m=(MyData*)data;
	printf("Name:%s Age:%d\n",m->name,m->age);
}
int main()
{
	
	//创建链表
	LinkList* list=Init_LinkList();
	MyData m1,m2,m3,m4,m5;
	strcpy(m1.name,"aaa");
	strcpy(m2.name,"bbb");
	strcpy(m3.name,"ccc");
	strcpy(m4.name,"ddd");
	strcpy(m5.name,"eee");
	m1.age=10;
	m2.age=20;
	m3.age=30;
	m4.age=40;
	m5.age=50;
	//插入节点
	Insert_LinkList(list,0,(LinkNode*)&m1);
	Insert_LinkList(list,0,(LinkNode*)&m2);
	Insert_LinkList(list,0,(LinkNode*)&m3);
	Insert_LinkList(list,0,(LinkNode*)&m4);
	Insert_LinkList(list,0,(LinkNode*)&m5);
	//打印
	Print_LinkList(list,MyPrint);
	//销毁
	FreeSpace_LinkList(list);

	return 0;
}

测试结果出现了一点bug 各位大神自行查找吧、、哈哈

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值