单链式存储结构 插入顺序的问题

69 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

基本思想: 将待插入元素与链表中的数据从前往后相比较,若链表中的元素小于待插入元素,继续比较下一个链表中的元素……,直到找到了第一个比待插入元素大的数据,就将待插入元素插入到此大的数据的前面。

注意问题:

1、当找到第一个比待插入元素大的数据时,最好将工作指针停在此数据的前一个结点,便于插入。
2、当未找到比待插入元素大的数据时,那么说明,待插入元素比链表中每一个数据都大,将待插入元素插入到链表的末端,条件是工作指针的指针域为空,即是到了链表的末端。
//头文件
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED


struct Node{
    Node *next;
    int data;
};

class LinkList{
public:
    LinkList(int *arr,int n);
    LinkList();
    ~LinkList();
    void orderInsert(int *arr,int n);  //将数组顺序(小到大)插入到链表中
    void printList();
    int length();
private:
    Node *first;
};
#endif // LINKLIST_H_INCLUDED

————————————————

需求:在线性表中的指定结点之后插入某一元素

PS :线性表采用 单链式 存储结构

![在这里插入图片描述](https://img-blog.csdnimg.cn/d9dbb4770f9045cc8e757e5c6b368473.png

插入顺序:

  1. 申请空间 q=(LinkList) malloc (sizeof(LNode))

  2. 数据域赋值 q-> data = x

  3. 插入(连续) 第一步: 将 q 结点的 next 地址指向 p 的 next 地址(q -> next = p -> next )

    第二步: 将 p 结点的 next 地址指向 q 结点(p -> next = q )

思考:上述第3点中的两个步骤的顺序可以颠倒吗?

不可以,看上述图片,如果先执行第二步,将 p 结点的 next 地址指向 q 结点,再执行第一步,将 q 结点的 next 地址指向 p 的 next 地址,那么此时 q 结点的 next 地址将指向自己,造成死循环。