一、引言
“大江东去,浪淘尽,千古风流人物。”一想起三国就不得不谈到几大以少胜多的战役,官渡之战、赤壁之战、夷陵之战。今天我们就以赤壁之战为模版讲述链表。面对孙刘联盟曹操采纳了“铁索连船”来克服北方人水土不服的弱点。链表的应用场景正好可以运用到“铁索连船”中去。假如诸位魏国的主公在“东风不与周郎便”的情况下又该如何发挥自己的旷世奇才。
二、链表的主要内容
在这危机四伏的江湖中,主公英明神武的领导、关于战场随机应变的调度可是决定战争胜利的关键因素。首先我们要考虑铁索连船的添加船只来进行排兵布阵,也就是链表的头插和尾插。但最重要的是要有船(结点),当然我们可以先创建一个结构体变量来存储变量的值和下一个元素的地址,再进行创建新的节点头插尾插操作,由于在函数中创建局部变量存储局部节点,一出函数就被系统回收了,所以我们要运用到合适的创建链表的工具,也就是薄利多销且效率至上的造船商。也就是运用malloc函数进行动态内存管理创建一个新的节点,并将他们自动连串。
二.1.链表的插入
头插:顾名思义就是将新创建的节点放在链表的开头。具体操作:将创建的新节点中结构体存储的地址修改为头结点自身的地址,再令头结点等于头插过来的新节点。具体代码如下:
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
SLTNode* add = (SLTNode*)malloc(sizeof(SLTNode));
add->data = x;
add->next = *pphead;
*pphead = add;
}
尾插:顾名思义就是将新创建的节点放在链表的末尾。具体操作:先将链表的头结点先保存起来,再令其走到空节点(假设链表的末尾为空)的前一个节点,将新创建的节点自身的地址存储入空节点(假设链表的末尾为空NULL)的前一个节点,再将头结点复原,具体代码如下:
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{
assert(pphead != NULL);
SLTNode* mid = *pphead;
if (mid == NULL)
{
mid = (SLTNode*)malloc(sizeof(SLTNode));
//SLTBuyNode(*pphead,x);
mid->data = x;
mid->next = NULL;
assert(mid != NULL);
exit ;
}
else
{
while (mid->next != NULL)
{
mid = mid->next;
}
mid->next = (SLTNode*)malloc(sizeof(SLTNode));
mid->next->data = x;
mid->next->next = NULL;
}
}
鉴于链表有可能为空,所以先进行判空再决定是创建新节点,还是尾插。
指定位置之后插入:还是先保存头结点,再走到指定位置,将指定位置后的节点保存下来,先将创建节点中结构体存储的指针等于指定位置后节点自身的地址,最后再令指定位置节点的指针等于新
创建节点自身地址。最后再将头结点复原。具体代码如下:
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
assert(pos != NULL);
SLTNode* add = (SLTNode*)malloc(sizeof(SLTNode));
add->data = x;
add->next = pos->next;
pos->next = add;
}
这些就是在战争备战阶段建造铁索连船,在局势复杂的战场中兵无常势、水无常形,想要取得胜利必须灵活多变。
二.2.链表的删除
在战争中一定会有战船受损无法参加战斗所以就需要舍小保大,那铁索连船中一定需要“裁员”。那链表中的部分节点也需要删除。
头删:先存储头节点,头节点往后走一位,再将原头节点释放掉。具体代码如下:
void SLTPopFront(SLTNode** pphead)
{
assert(pphead != NULL && (*pphead) != NULL);
SLTNode* mid = (*pphead);
(*pphead) = (*pphead)->next;
free(mid);
}
尾删:先保存头结点,令头结点走到尾(NULL)的前两个个节点处,释放该处的下一个节点,再将该处结构体中的指针置为NULL变成新的船尾。
void SLTPopBack(SLTNode** pphead)
{
assert(pphead != NULL&&(*pphead) != NULL );
SLTNode* del = *pphead;
while (del->next->next != NULL)
{
del = del->next;
}
free(del->next);
del->next = NULL;
}