企业链表模型——业务实体和底层链表算法分离

LinkList.h:

#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_

typedef void LinkList;

typedef struct _tag_LinkListNode
{
	struct _tag_LinkListNode *next;
}LinkListNode;

LinkList* LinkList_create();
int LinkList_Length(LinkList* list);

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
LinkListNode* LinkList_GetNode(LinkList* list, int pos);
LinkListNode* LinkList_DeleteNode(LinkList* list, int pos);

void LinkList_Destroy(LinkList* list);
void LinkList_Clear(LinkList* list);

#endif

LinkList.cpp:

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

#include "linklist.h"

typedef struct _tag_LinkList
{
	LinkListNode header;
	int length;
}TLinkList;

LinkList* LinkList_create()  //创建链表
{
	TLinkList *tmp = NULL;
	tmp = (TLinkList*)malloc(sizeof(TLinkList));
	if (tmp == NULL)
	{
		return NULL;
	}

	memset(tmp, 0, sizeof(TLinkList));
	tmp->length = 0;
	tmp->header.next = NULL;

	return tmp;
}
int LinkList_Length(LinkList* list) //获取长度
{
	TLinkList *tmp = NULL;
	tmp = (TLinkList*)list;
	if (tmp == NULL)
	{
		return -1;
	}

	return tmp->length;
}

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)  //插入节点
{
	int i = 0;
	LinkListNode *current = NULL;    //辅助指针变量
	TLinkList *tList = NULL;

	tList = (TLinkList*)list;
	if (list == NULL || node == NULL || pos < 0)
	{
		return -1;
	}

	current = &(tList->header);   //辅助指针变量初始化
	for (i = 0; i < pos; i++)
	{
		current = current->next;  //要求插入到3,原来的3变4,4变5
	}

	node->next = current->next;
	current->next = node;

	tList->length++;

	return 0;
}
LinkListNode* LinkList_GetNode(LinkList* list, int pos)//获取节点
{
	int i = 0;
	LinkListNode *current = NULL;
	TLinkList *tList = NULL;

	tList = (TLinkList*)list;
	if (list == NULL || pos < 0)
	{
		return NULL;
	}

	current = &(tList->header);
	for (i = 0; i < pos; i++)
	{
		current = current->next;   //链表带头结点
	}

	return current->next;
}
LinkListNode* LinkList_DeleteNode(LinkList* list, int pos)//删除节点
{
	int i = 0;
	LinkListNode *current = NULL;
	LinkListNode *tmp = NULL;  //缓冲要删除的节点
	TLinkList *tList = NULL;

	tList = (TLinkList*)list;
	if (list == NULL || pos < 0)
	{
		return NULL;
	}

	current = &(tList->header);
	for (i = 0; i < pos; i++)
	{
		current = current->next;
	}
	tmp = current->next;
	current->next = tmp->next;
	tList->length--;

	return tmp;
}

void LinkList_Destroy(LinkList* list)  //销毁链表
{
	if (list == NULL)
	{
		return;
	}
	free(list);
	return;
}
void LinkList_Clear(LinkList* list)  //清空链表
{
	TLinkList *tList = NULL;
	tList = (TLinkList*)list;

	tList->header.next = NULL;
	tList->length = 0;
	return;
}

LinkListMain:(测试框架)

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

#include "linklist.h"

typedef struct _Teacher
{
	//优点:可以让多个实体共用一个链表模型,实现了 业务实体 和 链表算法 的分离。————提高代码复用率
	LinkListNode node;   //写在结构体的第一项,node的地址就是Teacher的地址
	
	char name[32];
	int age;
}Teacher;

void main()
{
	LinkList *list = NULL;
	int i = 0;

	Teacher t1, t2, t3, t4, t5, t6;
	t1.age = 11;
	t2.age = 22;
	t3.age = 33;
	t4.age = 44;
	t5.age = 55;
	t6.age = 60;

	list = LinkList_create();

	LinkList_Insert(list, (LinkListNode*)&t1, 0);  
	LinkList_Insert(list, (LinkListNode*)&t2, 0);
	LinkList_Insert(list, (LinkListNode*)&t3, 0);
	LinkList_Insert(list, (LinkListNode*)&t4, 0);
	LinkList_Insert(list, (LinkListNode*)&t5, 0);
	LinkList_Insert(list, (LinkListNode*)&t6, 3);

	//遍历链表
	for (i = 0; i<LinkList_Length(list); i++)
	{
		Teacher *tmp = (Teacher *)LinkList_GetNode(list, i);
		if (tmp == NULL)
		{
			return;
		}
		printf("age:%d \n", tmp->age);
	}

	printf("\n");

	//删除链表结点
	while (LinkList_Length(list) > 0)
	{
		Teacher *tmp = (Teacher *)LinkList_DeleteNode(list, 0);
		if (tmp == NULL)
		{
			return;
		}
		printf("age:%d \n", tmp->age);
	}

	LinkList_Destroy(list);

}

模型图解:


没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试