插入:在第 i 个结点前插入新节点
假设 i=3,插入后变成这样
首先要找到第二个结点,然后修改第二个结点的next域,再修改 e结点 的next域
算法步骤:
① 首先找到 ai-1 结点的存储位置 p;
② 生成一个数据域为 e 的新节点 s;
③ 插入新节点:
1.)新节点的指针域指向结点 ai:s->next = p->next;
2.)结点ai-1的指针域指向新节点:p->next = s
插入完成。注意!!!!步骤1.)和步骤2.)不能互换!!!否则会丢失 ai 的地址!!!
除非再定义一个指针变量存储 ai 结点的地址!!!
代码:
//在 L 中第 i 个元素之前插入数据元素 e //插入一个新元素后,链表就多了一个元素,新的链表通过L返回,所以这个L也用了引用型的 Status ListInsert_L(LinkList &L, int i, ElemType e){ p = L->next; j = 1; //如果输入的i不合法,直接返回ERROR,不再继续执行 if(i<1){ return ERROR; } //循环条件:指针p 不为空,计数器 j 的值还没到 i-1 继续执行。 //如果 L 表结点数量比 i-1 小,那么运行着就会出现 指针p == NULL的情况 while(p!=NULL && j!=i-1){ p = p->next; j++; } //这里对应,如果 i-1 > j的情况 if(p == NULL){ return ERROR; } //生成新节点 s s = new LNode; //用新节点s的数据域存放 e s->data = e; //将结点s插入L中 s->next = p->next; p->next = s; return OK; }