目录
前期的链表有什么问题
没有问题,但是不够好,最常用的操作在链表尾部添加结点,是通过查找链表末尾然后再插入的,用时较长。
对于不是频繁在链表末尾 插入/删除操作,没什么影响。
那有没有什么方式来完善呢?添加尾结点指针,可以更好的解决频繁插入问题。标记链表末尾,在链表末尾插入时就不必遍历链表来查找链表末尾所在位置了。
注意,只是在链表尾部插入结点时,省了些许时间,因为是单向链表,尾结点指针无法直接前移,要想在链表末尾删除节点时省些时间,只能通过双向链表来实现了。
源文件及测试文件我上传到CSDN上了:Add Tail Pointer LinkedList.zip
怎么修改
最先需要修改的是链表的定义,之后就是修改在链表尾部添加结点函数,再之后就是针对初始化、插入、删除、清空等涉及到结点数发生变化的 函数添加尾结点指针指向。
typedef struct list
{
Node* head; /* 指向链表头的指针 */
Node* tail; /* #TODO 指向尾结点的指针 */
L_NUMBER_type items; /* 链表中的项数 */
}LinkedList;
/**
* LinkedListAddNode #TODO
* @brief 添加到链表尾部
* @param item 参数描述: 要写入结点的数据域
* @param plist 参数描述: 链表指针
* @retval true 返回值描述: 插入成功
* @retval false 返回值描述: 插入失败
* @note 1.若链表已满,返回失败 2.新建结点,数据域复制到结点 3.将结点插入到链表 4.记录链表尾端的位置,链表结点数加1
*/
bool LinkedListAddNode(Item item, LinkedList* plist)
{
Node* pnew;
if(LinkedListIsFull(plist))
{
return false; /* 若链表已满,返回失败 */
}
pnew = (Node*)malloc(sizeof(Node)); /* 新建结点 */
if(pnew == NULL)
{
printf("Unable to allocate memory! \n");
exit(1);
}
CopyToNode(item, pnew); /* 结点初始化 */
pnew->next = NULL;
if(LinkedList