已知要删除的节点地址,删除一个无头单链表的非尾节点(删除过程不能使用遍历)
原文链接🔗https://www.codercto.com/a/61809.html
新建一个链表,如下图
代码
//定义结构体
typedef struct del{
int data;
struct del * next;
}DL,*PDL;
//链表
PDL make_node(PDL plast, int data){
//判断传过来的参数是否为尾节点的地址
if(plast->next != NULL || plast == NULL){
printf("in funtion (make_node): no last or plast is NULL\n");
return NULL;
}
PDL pnew;
pnew = malloc(sizeof(DL));
if (pnew == NULL){
printf("in funtion (make_node): malloc fail\n");
return NULL;
}
pnew->data = data;
pnew->next = NULL;
plast->next = pnew;
return pnew;
}
make_node函数中的plast为链表中的尾节点。
节点删除
节点删除在上一篇文章中有讲,但现在不能使用遍历,只知道要删除节点的地址,可以这么做。
删除节点,要删除的是里面的数据。我们可以让pdel指向的节点里面的数据与pdel后一个节点的数据进行交换。要删除的就是pdel的后一个节点,如此要删除节点的前驱节点与继后节点都可以知道,时间复杂度变为O(1)。
//删除
bool del_node(PDL pdel){
//判断是否为尾节点
if(pdel->next == NULL || pdel == NULL){
printf("del_node is the last, del fail\n");
return false;
}
//定义p节点,使其指向pdel节点的后一个节点
PDL p = pdel->next;
int tmp;
//将pdel节点与p节点的数据互换
tmp = pdel->data;
pdel->data = p->data;
p->data = tmp;
//删除p节点
pdel->next = p->next;
p->next = NULL;
free(p);
return true;
}
遍历显示
//遍历显示
bool show_node(PDL phead){
if(phead == NULL)
return false;
PDL ptmp = phead;
printf("~~~~~~~~~~~~~~~~~~~~~\n");
while(ptmp != NULL){
printf("%d\t", ptmp->data);
ptmp = ptmp->next;
}
printf("\n~~~~~~~~~~~~~~~~~~~~~\n");
}
完整代码
//已知要删除的节点地址,删除一个无头单链表的非尾节点(删除过程不能使用遍历)
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//定义结构体
typedef struct del{
int data;
struct del * next;
}DL,*PDL;
//链表
PDL make_node(PDL plast, int data){
if(plast->next != NULL || plast == NULL){
printf("in funtion (make_node): no last or plast is NULL\n");
return NULL;
}
PDL pnew;
pnew = malloc(sizeof(DL));
if (pnew == NULL){
printf("in funtion (make_node): malloc fail\n");
return NULL;
}
pnew->data = data;
pnew->next = NULL;
plast->next = pnew;
return pnew;
}
//删除
bool del_node(PDL pdel){
//判断是否为尾节点
if(pdel->next == NULL || pdel == NULL){
printf("del_node is the last, del fail\n");
return false;
}
//定义p节点,使其指向pdel节点的后一个节点
PDL p = pdel->next;
int tmp;
//将pdel节点与p节点的数据互换
tmp = pdel->data;
pdel->data = p->data;
p->data = tmp;
//删除p节点
pdel->next = p->next;
p->next = NULL;
free(p);
return true;
}
//遍历显示
bool show_node(PDL phead){
if(phead == NULL)
return false;
PDL ptmp = phead;
printf("~~~~~~~~~~~~~~~~~~~~~\n");
while(ptmp != NULL){
printf("%d\t", ptmp->data);
ptmp = ptmp->next;
}
printf("\n~~~~~~~~~~~~~~~~~~~~~\n");
}
int main(void){
PDL phead = NULL, ptmp = NULL;
int i=1;
phead = malloc(sizeof(DL));
phead->data = 0;
phead->next = NULL;
ptmp = phead;
for(; i<4; i++){
PDL flag = NULL;
flag = make_node(ptmp, i);
if (flag == NULL){
printf("in funtion (main): make_node fail\n");
printf("i:\t%d\n",i);
return -1;
}
ptmp = flag;
}
show_node(phead);
del_node(phead->next->next);
show_node(phead);
}
初学笔记,欢迎纠错,侵权联系。