单链表的插入:
s->next=p->next;
p->next=s;
让p的后继结点改成s的后继结点,再把结点s变成p的后继结点。
注意:两句话的顺序不能交换。如果交换,则使得p->next给覆盖成s的地址。
/*初始条件:顺序线性表L已存在*/
/*操作结果:在L中第i个结点位置之前插入新的数据元素e,L的长度加1*/
Status ListInsert(LinkList *L,int i,ElemType e){
int j;
LinkList p,s;
p=*L; /*p指向链表表头*/
j=1;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i){
return ERROR;/*第i个结点不存在*/
}
s=(LinkList)malloc(sizeof(Node));/*生成新节点(stdlib.h)*/
s->data=e;
s->next=p->next;
p->next=s;/*让p的后继结点改成s的后继结点,再把结点s变成p的后继结点*/
return OK;
}
单链表的删除:
将要删除结点q的前继结点指针绕过,指向它的后继结点。
q=p->next;
p->next=q->next;
/*初始条件:顺序线性表L已存在*/
/*操作结果:在L中删除第i个结点,用e返回其值,L的长度减1*/
Status ListInsert(LinkList *L,int i,ElemType e){
int j;
LinkList p,q;
p=*L; /*p指向链表表头*/
j=1;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i){
return ERROR;/*第i个结点不存在*/
}
q=p->next;
p->next=q->next;/*将要删除结点q的前继结点指针绕过,指向它的后继结点*/
*e=q->data;
free(q);/*让系统回收此结点,释放内存*/
return OK;
}