单链表的插入与删除
单链表的插入
单链表第i个数据插入结点的算法思路:
1. 声明一个结点p指向第一个结点,初始化j从1开始;
2. 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
3. 若到链表末尾p为空,则说明第i个元素不存在;
4. 否则查找成功,在系统中生成一个空结点s;
5. 将数据元素e赋值给s->data;
6. 单链表的插入标准语句:s->next = p->next; p->next = s;
7. 返回成功。
/*初始条件:顺序线性表L已存在,1《i《ListLength(L)*/
/*操作结果:用e返回L中第i个数据元素的值*/
status ListInsert(LinkList L, int i, ElemType *e)
{
intj;
LinkListp,s;
p= *L;
j= 1;
while(p&&j<i)
{
p= p->next;
++j;
}
if(!p || j>1)
returnERROR;
s=(LinkList)malloc(sizeof(Node)); /*生成新结点*/
s->data = e;
s->next = p->next; /*将p的后继结点赋值给s的后继*/
p->next = s; /*将s赋值给p的后继*/
return OK;
}
单链表的删除
思路:
1. 声明一个结点p指向第一个结点,初始化j从1开始;
2. 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
3. 若到链表末尾p为空,则说明第i个元素不存在;
4. 否则查找成功,将欲删除的结点p->next赋值给q;
5. 单链表的删除标准语句p->next = q->next;
6. 将q结点中数据赋值给e,作为返回;
7. 释放q结点;
8. 返回成功;
/*初始条件:顺序线性表L已存在,1《i《ListLength(L)*/
/*操作结果:用e返回L中第i个数据元素的值*/
status ListDelete(LinkList L, int i, ElemType *e)
{
intj;
LinkListp,s;
p= *L;
j= 1;
while(p->next&&j<i)
{
p= p->next;
++j;
}
if(!(p->next) || j>1)
returnERROR;
q = p->next; /*将p的后继结点赋值给s的后继*/
p->next = q->next; /*将s赋值给p的后继*/
*e= q->data'
free(q);'
return OK;
}