大家好,我是阿林。我今天分享的c++中的链式存储。
对于数据结构上来说,新手都是在定义结构体直接写进链式存储中,但对于企业项目我们要做到定义的结构体和数据结构的链式存储分离才算好。
现在我们来学习怎么去分离结构体和链式存储
这个的主要思想是我们将结构体定义到main.c中通过使用(LinkListNode*)(&t1)强转去调用函数,返回的值再利用强转(Teacher*)LinkList_Get(list, i),得到值。这样就实现了分离。比较容易错误的一点我们定义结构体并不是传统意义上的结构体所以
typedef struct Teacher
{
LinkListNode node;
int age;
char name[64];
}Teacher;
中 LinkListNode node一定要放到最前面。
下面我们看看代码
linklistc文件
#include
#include
#include
#include "linklist.h"
typedef struct Teacher
{
LinkListNode node;
int age;
char name[64];
}Teacher;
void main()
{
int len = 0, ret = 0;
int i = 0;
LinkList* list = NULL;
Teacher t1, t2, t3, t4, t5;
t1.age = 31;
t2.age = 32;
t3.age = 33;
t4.age = 34;
t5.age = 35;
list = LinkList_Create();
if (list == NULL)
{
return;
}
len = LinkList_Length(list);
printf("len: %d\n", len);
//链表的算法和具体的业务结点的分离。
ret = LinkList_Insert(list, (LinkListNode*)(&t1), 0);
ret = LinkList_Insert(list, (LinkListNode*)(&t2), 0);
ret = LinkList_Insert(list, (LinkListNode*)(&t3), 0);
ret = LinkList_Insert(list, (LinkListNode*)(&t4), 0);
ret = LinkList_Insert(list, (LinkListNode*)(&t5), 0);
for (i = 0; i < LinkList_Length(list); i++)
{
Teacher* tmp = (Teacher*)LinkList_Get(list, i);
if (tmp == NULL)
{
return;
}
printf("tmp->age:%d", tmp->age);
}
//删除链表
while (LinkList_Length(list) > 0)
{
LinkList_Delete(list, 0);
}
LinkList_Destroy(list);
//LinkList* LinkList_Create();
//void LinkList_Destroy(LinkList * list);
//void LinkList_Clear(LinkList * list);
//int LinkList_Length(LinkList * list);
//int LinkList_Insert(LinkList * list, LinkListNode * node, int pos);
//LinkListNode* LinkList_Get(LinkList * list, int pos);
//LinkListNode* LinkList_Delete(LinkList * list, int pos);
system("pause");
return;
}
linklist.h文件
#pragma once
#ifndef MY_LINKLIST_H
#define MY_LINKLIST_H
typedef void LinkList;
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode;
LinkListNode node1;
LinkList* LinkList_Create();
void LinkList_Destroy(LinkList* list);
void LinkList_Clear(LinkList* list);
int LinkList_Length(LinkList* list);
int LinkList_Insert(LinkList* list,LinkListNode* node,int pos);
LinkListNode* LinkList_Get(LinkList* list,int pos);
LinkListNode* LinkList_Delete(LinkList* list, int pos);
#endif //
main.c
#include
#include
#include
#include "linklist.h"
typedef struct Teacher
{
LinkListNode node;
int age;
char name[64];
}Teacher;
void main()
{
int len = 0, ret = 0;
int i = 0;
LinkList* list = NULL;
Teacher t1, t2, t3, t4, t5;
t1.age = 31;
t2.age = 32;
t3.age = 33;
t4.age = 34;
t5.age = 35;
list = LinkList_Create();
if (list == NULL)
{
return;
}
len = LinkList_Length(list);
printf("len: %d\n", len);
//链表的算法和具体的业务结点的分离。
ret = LinkList_Insert(list, (LinkListNode*)(&t1), 0);
ret = LinkList_Insert(list, (LinkListNode*)(&t2), 0);
ret = LinkList_Insert(list, (LinkListNode*)(&t3), 0);
ret = LinkList_Insert(list, (LinkListNode*)(&t4), 0);
ret = LinkList_Insert(list, (LinkListNode*)(&t5), 0);
for (i = 0; i < LinkList_Length(list); i++)
{
Teacher* tmp = (Teacher*)LinkList_Get(list, i);
if (tmp == NULL)
{
return;
}
printf("tmp->age:%d", tmp->age);
}
//删除链表
while (LinkList_Length(list) > 0)
{
LinkList_Delete(list, 0);
}
LinkList_Destroy(list);
//LinkList* LinkList_Create();
//void LinkList_Destroy(LinkList * list);
//void LinkList_Clear(LinkList * list);
//int LinkList_Length(LinkList * list);
//int LinkList_Insert(LinkList * list, LinkListNode * node, int pos);
//LinkListNode* LinkList_Get(LinkList * list, int pos);
//LinkListNode* LinkList_Delete(LinkList * list, int pos);
system("pause");
return;
}