链表的定义:
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
因为链表不用必须按顺序进行存储,因此可以对链表进行增、删、改、查等操作,下面先介绍链表的几个插入的例子:
1.链表的插入:
链表的插入可以分为头插和尾插和按位置插入,顾名思义就是从头插入元素和从尾部插入元素还有从某一位置插入;
头插法:
申请一个新节点,让头结点的指针域指向新节点的数据域,新节点的指针域保存第一个元素的地址,则插入成功;
参考代码如下:
bool InsertHead(PLink phead, ELEM_TYPE val)
{
if (phead == NULL)
{
return false;
} //判断链表是否为空
PLink pnewnode = BuyNode(val);
if (pnewnode == NULL)
{
return false;
} //申请新节点
pnewnode->pnext = phead->pnext;
phead->pnext = pnewnode; //新节点插入
return true;
}
尾插法:
先从头开始遍历,找到链表的尾结点,尾结点的指针域保存新节点的地址,则元素插入成功 ;
参考代码如下:
bool InsertTail(PLink phead, ELEM_TYPE val)
{
if (phead == NULL)
{
return false;
} //判断链表是否为空
PLink pCur = phead;
while (pCur->pnext != NULL)
{
pCur = pCur->pnext;
} // 遍历整个链表,找到到尾结点
PLink pnewnode = BuyNode(val);
if (pnewnode == NULL)
{
return false;
} //申请新节点
pCur->pnext = pnewnode; // 插入新节点
return true;
}
按位置插入:
元素插入步骤:
1.判断结构是否合理;
2.判断插入位置是否合理;
3.查找要插入位置的前置结点
4.插入
先遍历链表,找到要插入元素的位置,将申请的新节点进行插入,遍历时应先找到插入位置的前一个结点,让其指针域保存新节点的地址,再让新节点的指针域指向下一个元素的地址,则插入成功;
参考代码如下:
bool InsertPos(PLink phead, int pos, ELEM_TYPE val)
{
if (phead == NULL)
{
return false;
} // 判断结构是否合理
if (pos < 0 || pos > GetLength(phead))
{
return false;
} // 判断插入位置是否合理
PLink pfront = phead;
for (int i = 0; i < pos; ++i)
{
pfront = pfront->pnext;
} //查找要插入位置的前置结点
PLink pnewnode = BuyNode(val);
if (pnewnode == NULL)
{
return false;
}
pnewnode->pnext = pfront->pnext;
pfront->pnext = pnewnode; //插入
return true;
}