C语言实现企业链表

 

企业链表

 

在企业链表种,没有新结点的创建和删除,只是把成员依次串起来

企业链表声明LinkList.h

#pragma once

typedef struct LINKNODE
{
	struct LINKNODE *next;
}LinkNode;

typedef struct LINKLIST
{
	LinkNode head;
	int size;
}LinkList;

typedef void(*PRINTNODE)(LinkNode*);                                             // 打印函数指针
typedef int(*COMPARENNODE)(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,COMPARENNODE compare);          // 查找
int Size_LinkList(LinkList* list);                                               // 返回链表的大小
void Print_LinkList(LinkList* list, PRINTNODE print);                            // 打印
void FreeSpace_LinkList(LinkList* list);                                         // 释放链表内存

函数实现

#include "List.h"
#include <stdio.h>
#include <stdlib.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;

	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--;
}

void Print_LinkList(LinkList* list, PRINTNODE print)
{
	if (list == NULL)
		return;

	LinkNode* pCurrent = list->head.next;
	while (pCurrent != NULL)
	{
		print(pCurrent);
		pCurrent = pCurrent->next;
	}

}

void FreeSpace_LinkList(LinkList* list)
{
	if (list == NULL)
	{
		return;
	}
	free(list);
}

int Find_LinkList(LinkList* list, LinkNode* data, COMPARENNODE compare)
{
	if (list == NULL)
		return -1;

	if (data == NULL)
		return -1;

	int index = 0;
	int flag = -1;
	LinkNode* pCurrent = list->head.next;
	while (pCurrent)
	{
		if (compare(pCurrent, data) == 0)
		{
			flag = index;
			break;
		}
		pCurrent = pCurrent->next;
		index++;
	}

	return flag;
}

int Size_LinkList(LinkList* list)
{
	if (list == NULL)
		return -1;

	return list->size;
}

测试函数

#define  _CRT_SECURE_NO_WARNINGS
#include "List.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct PERSON
{
	LinkNode node;
	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* node1, LinkNode* node2)
{
	Person* p1 = (Person*)node1;                // 类型强转
	Person* p2 = (Person*)node2;

	if (strcmp(p1->name, p2->name) == 0 &&
		p1->age == p2->age)
		return 0;

	return -1;
}



int main()
{
	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);

	Print_LinkList(list, MyPrint);

	Remove_LinkList(list, 2);

	printf("------------------\n");

	Print_LinkList(list, MyPrint);

	Person findP;
	strcpy(findP.name, "ccc");
	findP.age = 30;

	int pos = Find_LinkList(list, (LinkNode*)&findP, MyCompare);
	printf("位置:%d\n", pos);

	FreeSpace_LinkList(list);

	system("pause");

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值