单向链表_版本二

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"

// 链表节点
struct LinkNode
{
	struct LinkNode *next;
};
// 链表
struct LList
{
	struct LinkNode header;		//头节点
	int size;
};
typedef void * LinkList;

// 初始化链表
LinkList Init_LinkList()
{
	struct LList *list = (struct LList *)malloc(sizeof(struct LList));
	// struct LList *list = malloc(sizeof(struct LList));
	if (NULL == list)
	{
		return NULL;
	}
	list->header.next = NULL;
	list->size = 0;
	return list;
}
// 往链表中插入数据
void Insert_LinkList(LinkList list, int pos, void *data)
{
	if (NULL == list)
	{
		return;
	}
	if (NULL == data)
	{
		return;
	}
	struct LList *mylist = (struct LList *)list;
	// 数据只取前四个节点
	struct LinkNode *mynode = (struct LinkNode *)data;
	if (pos < 0 || pos > mylist->size)
	{
		pos = mylist->size;
	}
	struct LinkNode *pCurrent = &(mylist->header);
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	// 数据插入链表
	mynode->next = pCurrent->next;
	pCurrent->next = mynode;
	mylist->size++;
}
// 遍历节点
void Foreach_LinkList(LinkList list, void(*myforeach)(void *))
{
	if (NULL == list)
	{
		return;
	}
	if (NULL == myforeach)
	{
		return;
	}
	struct LList *mylist = (struct LList *)list;
	struct LinkNode *pCurrent = mylist->header.next;
	while (pCurrent != NULL)
	{
		struct LinkNode *pNext = pCurrent->next;
		myforeach(pCurrent);
		pCurrent = pNext;
	}
}

// 删除节点
void RemoveByPos_LinkList(LinkList list, int pos)
{
	if (NULL == list)
	{
		return;
	}
	struct LList *mylist = (struct LList *)list;
	if (pos < 0 || pos > mylist->size -1)
	{
		return;
	}
	// 辅助指针
	struct LinkNode *pCurrent = &(mylist->header);
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	// 缓存下一个待删除的节点
	struct LinkNode *pDel = pCurrent->next;
	// 重新建立待删除节点的前驱和后继节点关系
	pCurrent->next = pDel->next;
	mylist->size--;
}

// 销毁链表
void Destory_LinkList(LinkList *list)
{
	if (NULL == list)
	{
		return;
	}
	
	free(*list);
	*list = NULL;
}



struct Person
{
	/*
	 包含的linknode 应该是一个指针,如果是结构体的话,当linknode 里面 不单单只有一个指针的话,那么就会出现问题
	*/
	struct linknode *node;
	char name[64];
	int age;
};



void myPrint(void *data)
{
	struct Person *p = (struct Person *)data;
	printf("Name : %s Age : %d \n", p->name, p->age);
}

void test()
{
	//初始化链表
	LinkList list = Init_LinkList();


	//创建数据
	struct Person p1 = { NULL, "aaa", 10 };
	struct Person p2 = { NULL, "bbb", 20 };
	struct Person p3 = { NULL, "ccc", 30 };
	struct Person p4 = { NULL, "ddd", 40 };
	struct Person p5 = { NULL, "eee", 50 };
	struct Person p6 = { NULL, "fff", 60 };


	//插入数据
	Insert_LinkList(list, 0, &p1);
	Insert_LinkList(list, 0, &p2);
	Insert_LinkList(list, 0, &p3);
	Insert_LinkList(list, 0, &p4);
	Insert_LinkList(list, 0, &p5);
	Insert_LinkList(list, 0, &p6);


	//遍历
	Foreach_LinkList(list, myPrint);
	RemoveByPos_LinkList(list, 1);
	printf("------------------------\n");
	Foreach_LinkList(list, myPrint);

	Destory_LinkList(&list);
	printf("------------------------\n");
	Foreach_LinkList(&list, myPrint);
}


int main()
{
	test();

	system("pause");
	return EXIT_SUCCESS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值