c语言单链表程序,有段程序意思不明白,求解读
创建单链表与main程序省略程序功能:一个链表从i开始到len删除,HeadLink*delinsert(HeadLink*head,inti,intlen){HeadL...
创建单链表与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<i){ /*让p指向将要删除结点的前一个结点*/
k++;
p=p->next;
}
if(k<i){ /*本来上面就已经给出了判断k<i 这段程序什么意思?*/
printf("error");
exit(0);
}
q=p->next; /*q指向了将要删除的结点*/
k=1;
while(q&&k<len){
k++;
u=q; /*这段程序我没读懂,u只是在这行和下面一行出现过*/
q=q->next; /*q最后将移位到要删除的末尾位置*/
free(u); /*第二次出现是直接被释放了*/
}
if(k<len){
printf("%d too big \n",len);
exit(0);
}
p->next=q; /*删除了结点*/
} 展开
程序功能:一个链表从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<i){ /*让p指向将要删除结点的前一个结点*/
k++;
p=p->next;
}
if(k<i){ /*本来上面就已经给出了判断k<i 这段程序什么意思?*/
printf("error");
exit(0);
}
q=p->next; /*q指向了将要删除的结点*/
k=1;
while(q&&k<len){
k++;
u=q; /*这段程序我没读懂,u只是在这行和下面一行出现过*/
q=q->next; /*q最后将移位到要删除的末尾位置*/
free(u); /*第二次出现是直接被释放了*/
}
if(k<len){
printf("%d too big \n",len);
exit(0);
}
p->next=q; /*删除了结点*/
} 展开
4个回答
展开全部
创建单链表与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<i){ /*让p指向将要删除结点的前一个结点*/
k++;
p=p->next;
}
if(k<i){ /*本来上面就已经给出了判断k<i 这段程序什么意思?*/
//如果上面的循环是因为p==NULL结束掉的,那么说明给定的i超出链表长度了
printf("error");
exit(0);
}
q=p->next; /*q指向了将要删除的结点*/
k=1;
while(q&&k<len){
k++;
u=q; /*这段程序我没读懂,u只是在这行和下面一行出现过*/
//这儿必须要这样,这是记录要删除的结点的地址,不然你下面直接指向到下一个结点,你就找不到要删除的结点了,也就删除不了了
q=q->next; /*q最后将移位到要删除的末尾位置*/
free(u); /*第二次出现是直接被释放了*/
//因为是要删除结点,这儿当然要释放,动态申请的内存就是要这样释放掉
}
if(k<len){
printf("%d too big \n",len);
exit(0);
}
p->next=q; /*删除了结点*/
}
程序功能:一个链表从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<i){ /*让p指向将要删除结点的前一个结点*/
k++;
p=p->next;
}
if(k<i){ /*本来上面就已经给出了判断k<i 这段程序什么意思?*/
//如果上面的循环是因为p==NULL结束掉的,那么说明给定的i超出链表长度了
printf("error");
exit(0);
}
q=p->next; /*q指向了将要删除的结点*/
k=1;
while(q&&k<len){
k++;
u=q; /*这段程序我没读懂,u只是在这行和下面一行出现过*/
//这儿必须要这样,这是记录要删除的结点的地址,不然你下面直接指向到下一个结点,你就找不到要删除的结点了,也就删除不了了
q=q->next; /*q最后将移位到要删除的末尾位置*/
free(u); /*第二次出现是直接被释放了*/
//因为是要删除结点,这儿当然要释放,动态申请的内存就是要这样释放掉
}
if(k<len){
printf("%d too big \n",len);
exit(0);
}
p->next=q; /*删除了结点*/
}
展开全部
if(k<i){ /*本来上面就已经给出了判断k<i 这段程序什么意思?*/
printf("error");
exit(0);
}
这里是判断k是否等于i了,如果链表长度小于i,这时候k值肯定小于i,之后自然没法删i处得节点了。
while(q&&k<len){
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;这样对比就很明确操作意义了。
printf("error");
exit(0);
}
这里是判断k是否等于i了,如果链表长度小于i,这时候k值肯定小于i,之后自然没法删i处得节点了。
while(q&&k<len){
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<i 这个可以放在前面,也是用来判断输入参数是否正确,链表开始应该是1,如果i<1那就不对了。
因为删除节点是一个一个删除的,而c语言里面删除是用free。当删除的时候。指向下一个节点的指针也没了。 所以用u指向当前要删除的节点,p指向下一个节点。 然后释放当前节点。
因为删除节点是一个一个删除的,而c语言里面删除是用free。当删除的时候。指向下一个节点的指针也没了。 所以用u指向当前要删除的节点,p指向下一个节点。 然后释放当前节点。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个判断k<i 是因为如果p点已经为NULL 但是K<i 这一样会结束while循环 所以后面要检查
第二个U 我觉得不是要删除p指向的节点1吗 肯定不能立刻删除P节点啊,你得先让p指向下一个要删的节点2,同时还得有指向要删除的节点1的向量啊 所以把p赋给u 然后p指向下一个节点
第二个U 我觉得不是要删除p指向的节点1吗 肯定不能立刻删除P节点啊,你得先让p指向下一个要删的节点2,同时还得有指向要删除的节点1的向量啊 所以把p赋给u 然后p指向下一个节点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询