本讲讲述单对向链表的第x个结点进行删除,示意图如下所示,
用C语言实现如下,
singLinkList.h头文件内容声明如下:
int SingLinkList_xPositionDelete(BOOKLT *bookHeadNode,uint8_t x);//删除指定的x结点
singLinkList.c文件内容定义如下:
//指定位置删除该位置的结点
int SingLinkList_xPositionDelete(BOOKLT *bookHeadNode,uint8_t x)
{
BOOKLT * p = NULL; //创建一个BOOKLT结构类型的指针
BOOKLT * q = NULL; //创建一个BOOKLT结构类型的指针
uint8_t i = 0;
p = bookHeadNode;
while( p && (i < x-1))//遍历找到指定删除结点的前一个结点
{
p=p->next;//
i++;
}
if(!(p->next) || (i >x-1))//如果链表头结点的next为空,没有子结点;或结点的遍历累积变量超过指定删除结点的位置
{
return -1;
}
q = p->next; //pNode和p指向同一个结点
p->next = q->next;//q->next跳过指定结点指向下一个节点pNode,如果是删除最后一个结点这里p->next = q->next=NULL;
free(q);//必须释放指定删除的结点堆缓存
return true;
}
main.c主文件内容实现如下:
int main()
{
int n = 0;
char findBookInfo[50];//定义一个用户装载手动输入的信息缓存
BOOKLT *myBookHeadNode;//定义一个BOOKLT类型的头结点指针
memset(findBookInfo,0,sizeof(findBookInfo));
myBookHeadNode = SingLinkList_Create();//上面的链表内存已经被释,重新放创建一个头结点
SingLinkList_TailInsert_method2(myBookHeadNode,sizeof(bookStock)/sizeof(BOOKINFO),bookStock);//后插法插入节点
printf("===========所有图书信息打印如下===========rn");
SingLinkList_Traverse(myBookHeadNode);//遍历单向链表
printf("rn============删除信息后打印如下============rn");
SingLinkList_xPositionDelete(myBookHeadNode,16);
SingLinkList_Traverse(myBookHeadNode);//遍历单向链表
SingLinkList_Destory(myBookHeadNode);//释放各个结点的内存和头结点的内存
return 0;
}
删除图书信息的前后如下图所示:
注意对比查看,"9787811231557,Eclipse基础与应用,35"这一项已经被删除。
到此,链表的结点删除功能已实现,谢谢。
CSDN总提示说内容不够,我也写不了那么多,字数来凑吧。
2022.06.13结。



