单链表的删除操作需要注意的地方:
删除之前必须先找到要删结点的前驱结点,所以在查找判断条件要用p->next!=NULL任何要改变链表本身的操作(如增加,删除,),都不能乱动头结点的位置,而是需要额外定义一个指针指向头结点,然后用这个指针操作
typedef struct LNode{
int data;
struct LNode
*next;
}LNode;
void createLink(LNode
*&p,
int arr[],
int n){
//尾插法创建单链表
int i;
LNode
*s,
*r;
p=(LNode
*)malloc(sizeof(LNode));
p->
next=NULL;
//创建头结点
r=p;
//坑点:头结点一定不能乱动
for(i=
0;i<n;i++){
s=(LNode
*)malloc(sizeof(LNode));
s->data=arr[i];
r->
next=
s;
r=
s;
}
r->
next=NULL;
}
int del(LNode
*&p,
int key){
//删除结点
LNode
*r,
*q;
r=p;
//坑点:要改变链表的操作中,一定不能乱动头结点,而是重新定义一个结点指向头结点
while(r->
next!=NULL){
//这里用p->
next判断是为了找到要删除的前驱结点
if(r->
next->data==key){
//先找到要删除结点的前驱结点
q=r->
next;
r->
next=
q->
next;
free(
q);
return 1;
}
r=r->
next;
}
return 0;
}
void
print(LNode
*p){
LNode
*q;
q=p->
next;
while(
q!=NULL){
printf(
"%d ",
q->data);
q=
q->
next;
}
printf(
"\n");
}
int main(
int argc, char
** argv) {
LNode
*p;
int arr[]={
12,
5,
89,
47,
22,
36};
createLink(p,arr,
6);
printf(
"删除前: ");
print(p);
del(p,
47);
printf(
"删除后: ");
print(p);
return 0;
}