写在前面
1、在写链表之前,说实话一直很模糊,觉得理解了,但是一直没有自己敲出来,要用到链表了,一时又没有,特别是调试的时候,也会有时间,再次让我坚定了实践是检验标准的唯一真理。
2、记录是一种优秀的品质。
我理解的单链表
1、什么是单链表,我理解为就是一个链子,只要你抓住了链子的头,你就可以为所欲为。当然这个链子只有一个头。
2、每个链子都有固定的样子,也就是一个模板,模板里面有一个线,就是要把他们连接起来,也就是传说中指向同类的指针。
实现
1、模板定义
1、首先就是数据部分,这取决于你想把什么东西连起来,一个整型、一个字符串、一堆数据。因此一般是自定义数据类型,也就是结构体。
2、再次就是指针域了,这可是精华部分了,没有这个,链表就玩不起来。
2、生成头结点接口和节点接口
1、头结点,什么是头结点?就是首节点(首个有效结点)的前一个结点,要和首节点区分。使用头结点是为了方便对链表的操作。
2、每添加一个数据就要生成一个结点。
3、代码
1、定义数据结构
#define CARD_DEAL_VALUE 8 //比较字段键值的长度
#define CARD_DEAL_TIME 14 //保存当前时间的长度
///<[cct \@decard] | 链表数据
typedef struct CARD_INFO_struct
{
unsigned char ucaCardKey[CARD_DEAL_VALUE+1]; //卡的CSN
unsigned char ucDealTime[CARD_DEAL_TIME+1]; //交易时间
}CARD_INFO_T;
typedef struct LINK_CARD_INFO_struct
{
CARD_INFO_T stCardInfo;
struct LINK_CARD_INFO_struct *pNext;
}LINK_CARD_INFO_T;
2、创建
//创建头结点,并返回头结点指针
LINK_CARD_INFO_T *CreateLink(void)
{
LINK_CARD_INFO_T *plink = (LINK_CARD_INFO_T *)malloc(sizeof(LINK_CARD_INFO_T));
if( NULL == plink )
{
return plink;
}
//初始化数据
memset(plink, 0, sizeof(LINK_CARD_INFO_T));
return plink;
}
//创建结点,返回结点指针,并给结点进行赋值
LINK_CARD_INFO_T *CreateLinkNode(CARD_INFO_T data)
{
LINK_CARD_INFO_T *pNode = (LINK_CARD_INFO_T *)malloc(sizeof(LINK_CARD_INFO_T));
if( NULL == pNode )
{
return pNode;
}
//初始化,并赋值
memset(pNode, 0, sizeof(LINK_CARD_INFO_T));
pNode->stCardInfo = data;
return pNode;
}