一.单链表练习和一些功能实现
【1】单链表实现字典查询
(1)定义存放数据的结构体,在每次向里面存放数据时候需要清空
(2)对字典进行切割
空格切割字母,再从剩余里切割到解释,这里windows的txt文件下,以\r\n结尾,切除\r保留\n
(3)存放进结构体中
(4)插入链表,插入函数
(5)从键盘获得要查询的单词,\n读入需要消除
(6)进行查找
【2】单链表的剩余操作
(1)单链表的逆序
1.三个指针分别指向前中后三个节点
2.将中间节点下一个指向前节点
3.将三个指针后移一格
4.最后将最后节点的位置给头
(2)中间元素的查找
定义两指针,一个走两格,一个走一格
(3)查找末尾链表
一个先走,然后同步走
(4)链表的排序
int InsertSortLinkList (LinkList *ll)
{
// 获取链表的头节点
LinkNode *phead = ll->head;
// 初始化要插入的节点为头节点的下一个节点(链表的第一个有效节点)
LinkNode *pinsert = phead->next;
// 保存下一个待处理节点,避免在插入过程中丢失链表的连接
LinkNode *pnext = pinsert->next;
// 将头节点的 next 指针置为空,表示初始时有序区为空
phead->next = NULL;
// 开始排序循环
while (1)
{
// 每次循环重新从头节点开始遍历,寻找合适的插入位置
phead = ll->head;
// 遍历有序区,找到合适的插入位置
// 条件:当前节点的下一个节点不为空,且待插入节点的年龄大于当前节点和下一个节点的年龄
while (phead->next != NULL && pinsert->data.age > phead->data.age
&& pinsert->data.age > phead->next->data.age)
{
// 移动到下一个节点
phead = phead->next;
}
// 如果待插入节点的年龄小于头节点的年龄,说明它应该插入到链表头部
if (pinsert->data.age < phead->data.age)
{
// 将待插入节点的 next 指针指向头节点
pinsert->next = phead;
// 更新头节点为待插入节点
ll->head = pinsert;
}
else
{
// 否则,将待插入节点插入到当前节点和下一个节点之间
pinsert->next = phead->next;
// 更新当前节点的 next 指针,使其指向待插入节点
phead->next = pinsert;
}
// 更新待插入节点为下一个待处理节点
pinsert = pnext;
// 如果待插入节点为空,说明所有节点都已插入完成,退出循环
if (NULL == pinsert) { break; }
// 保存下一个待处理节点
pnext = pnext->next;
}
// 排序完成,返回 0 表示成功
return 0;
}