您的位置:首页 > 其它

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

2016-02-29 17:20 337 查看
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);

}

模型图解:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表