创建单链表与main程序省略
程序功能:一个链表从i开始到len删除,
HeadLink *delinsert(HeadLink *head,int i,int len){
HeadLink *p,*q,*u;
int k=1;
if(i<1||len<1){ /*如果i and len 都小于1,提示错误结束函数*/
printf("error");
exit(0);
}
p=head; /*p保存链表头指针*/
while(p&&k k++;
p=p->next;
}
if(k //如果上面的循环是因为p==NULL结束掉的,那么说明给定的i超出链表长度了
printf("error");
exit(0);
}
q=p->next; /*q指向了将要删除的结点*/
k=1;
while(q&&k
u=q; /*这段程序我没读懂,u只是在这行和下面一行出现过*/
//这儿必须要这样,这是记录要删除的结点的地址,不然你下面直接指向到下一个结点,你就找不到要删除的结点了,也就删除不了了
q=q->next; /*q最后将移位到要删除的末尾位置*/
free(u); /*第二次出现是直接被释放了*/
//因为是要删除结点,这儿当然要释放,动态申请的内存就是要这样释放掉
}
if(k
exit(0);
}
p->next=q; /*删除了结点*/
}
if(k printf("error");
exit(0);
}
这里是判断k是否等于i了,如果链表长度小于i,这时候k值肯定小于i,之后自然没法删i处得节点了。
while(q&&k
u=q; /*这段程序我没读懂,u只是在这行和下面一行出现过*/
q=q->next; /*q最后将移位到要删除的末尾位置*/
free(u); /*第二次出现是直接被释放了*/
}
u=q;之并后让q=q->next;其实就是q=u->next;free(u);删除了当前节点,这时候,q已经指向了下一个待处理的节点。如果是双链表的话,还需要把q->next->prior=q->prior,q->prior->next=q->next;这样对比就很明确操作意义了。
判断k
因为删除节点是一个一个删除的,而c语言里面删除是用free。当删除的时候。指向下一个节点的指针也没了。 所以用u指向当前要删除的节点,p指向下一个节点。 然后释放当前节点。
第一个判断k第二个U 我觉得不是要删除p指向的节点1吗 肯定不能立刻删除P节点啊,你得先让p指向下一个要删的节点2,同时还得有指向要删除的节点1的向量啊 所以把p赋给u 然后p指向下一个节点