单向链表的初始化、插入及遍历的实现【企业版】

单向链表的初始化、插入及遍历的实现【企业版】,第1张

单向链表的初始化、插入及遍历的实现【企业版】

节点的结构体定义

struct LinkNode{
	struct LinkNode *next;
};

该节点只有一个指针域成员,没有数据域成员。


用户数据需预留4个字节(32位程序)给底层函数使用

链表的结构体定义

struct LList{
	struct LinkNode pHeader;
	int m_size;
};

泛型指针的重定义

typedef void * LinkList;
1.单向链表的初始化
  • 函数设计为LinkList inintLinkList();
  • 该函数初始化链表会返回一个泛型链表
  • 初始化内容是动态创建一个链表结构体变量,并初始化里面的成员
LinkList initLinkList()
{
	struct LList *myList = malloc(sizeof(struct LList));
	if(myList == NULL)
		return;
	
	myList->pHeader = NULL;
	myList->m_size = 0;
	
	return myList;
}
2.单向链表的节点插入
  • 函数设计为void insertLinkList(LinkList list,int pos,void *data);
  • pos为待插入节点的位置,需找到它的前驱节点
  • void *data用于接收节点数据
void insertLinkList(LinkList list,int pos,void *data)
{
	if(list == NULL || data == NULL)
		return;
	struct LList *myList = list;
	if(pos < 0 || pos > myList->m_size - 1)
		pos = myList->m_size;
	
	struct LinkNode *pCurrentNode = &myList->pHeader;
	//找到待插入节点的前驱节点
	for(int i = 0; i < pos; i++)
		pCurrentNode = pCurrentNode->next;

	struct LinkNode *myNode = data;
	//更改指针指向,插入节点
	myNode->next = pCurrentNode->next;
	pCurrent->next = myNode;

	myList->m_size++;
}
3.单向链表的节点遍历打印
  • 函数设计为void foreachLinkList(LinkList list,void(*myPrint)(void*));
  • myPrint为函数指针,用于接收用户的回调函数
void foreachLinkList(LinkList list,void(*myPrint)(void*))
{
	if(list == NULL)
		return NULL;

	struct LList *myList = list;
	struct LinkNode *myNode = &myList->pHeader;

	for(int i = 0; i < myList->m_size; i++)
	{
		myNode = myNode->next;
		myPrint(myNode);
	}
}

回调函数的设计

struct Person
{
	void *node;
	char name[64];
	int age;
}
void myPrintPerson(void *data)
{
	struct Person *p = data;
	printf("姓名:%s  年龄:%d\n",p->name,p->age);
}
4.测试调用
void test()
{	
	//初始化链表
	LinkList myList = initLinkList();
	//创建数据
	struct Person p1 = {NULL,"aaa",10};
	struct Person p2 = {NULL,"bbb",20};
	struct Person p3 = {NULL,"ccc",30};
	struct Person p4 = {NULL,"ddd",40};
	//插入节点
	insertLinkList(myList,0,&p1);
	insertLinkList(myList,1,&p2);
	insertLinkList(myList,2,&p3);
	insertLinkList(myList,3,&p4);

	foreach(myList,myPrintPerson);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/578807.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存