插入:在第i个结点钱插入一个新结点
算法步骤:
- 说先找到a(i-1)的存储位置p
- 生成一个数据为e的新节点s
- 插入新结点:①新节点指针域指向结点ai ②结点a(i-1)的指针域指向新结点
s->next = p->next;
p->next = s;
如果要把结点s
插入到第i-1
个位置,需要找到第ai个位置,
p->next
表示的是p
结点的指针域,也是ai的地址,
①首先把第i个结点的指针域放到s
里面,
s->next = p->next;
②然后再把s
的地址放到p
结点的指针域中。
p->next = s;
思考:步骤①和步骤②不能调换位置,否则s
结点就会指向自己。
2.课本上插入操作解读
代码
/* 在单链表指定位置插入一个新元素 */
/* 参数:LinkedList *L 单链表L */
/* ElemType item 需要添加的新元素*/
/* int pos 新元素的插入位置 */
/* 返回值:int 是否插入成功 */
int ListInsert(LinkedList *L, Elemtype item, int pos)
{
Node *q = (Node *)malloc(sizeof(Node));
Node *p;
int i = 0;
q->data = item;
q->next = NULL;
/* 插入位置不正确
pos小于1表示在第一个位置之前插入
pos大于lastIndex+1表示在最后一个结点后面的第二个结点前面插入 如图所示
*/
if((pos<1)|| (pos>L->count+1)
{
printf("Position is error!");
return FAILURE;
}
if(L->head == NULL) /*单链表为空*/
{
L->head = q;
L->count+i+;
return SUCCESS;
}
}