下图是一个创建好的链表
下面我们需要删除一个结点,例如删除第3个结点
首先定义一个指针p,并且将p指向第二个结点
然后定义一个指针q,将q指向需要删除的结点
将p指向的结点和q指向的结点相连
p->pNext = q->pNext
清空q指向的结点
free(q);
q = NULL;
删除后的链表
程序代码:
#include <stdio.h> #include <stdlib.h> typedef struct Node//结点结构 { int data;//数据域 struct Node *pNext;//指针域 }NODE, *PNODE; //创建链表 PNODE Create_list(void); //遍历链表 void Traverse_list(PNODE pHead); //删除链表中的结点 void Delete_list(PNODE pHead, int pos); void main() { PNODE pHead = NULL; pHead = Create_list();//创建一个非循环单链表 Traverse_list(pHead);//遍历链表 Delete_list(pHead, 3); Traverse_list(pHead);//遍历输出链表中的数据 system("pause"); } //创建链表 PNODE Create_list(void) { int len;//结点的个数 int val;//临时保存结点的值 //分配一个不存放有效数据的头结点 PNODE pHead = (PNODE)malloc(sizeof(NODE)); if(NULL == pHead) { printf("内存分配失败,程序终止!"); exit(-1); } //定义一个永远指向尾结点的结点 PNODE pTail = pHead; pTail->pNext = NULL; printf("请输入您需要生成的链表的结点的个数:"); scanf("%d",&len); for(int i=0; i<len; i++) { printf("请输入第%d个结点的值:", i+1); scanf("%d",&val); //创建一个临时结点 PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pNew) { printf("内存分配失败,程序终止!"); exit(-1); } pNew->data = val; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } //遍历链表 void Traverse_list(PNODE pHead) { PNODE p = pHead->pNext; while(NULL != p) { printf("%d ", p->data); p = p->pNext; } printf("\n"); return; } //删除链表中的结点 void Delete_list(PNODE pHead, int pos) { PNODE p = pHead;//定义一个指向头结点的指针p用于查找删除结点的位置 int i = 0;//定义一个变量i用于查找删除结点的位置 //寻找删除结点的位置 while(NULL != p->pNext && i<pos-1) { p = p->pNext; i++; } //判断是否找到了删除结点的位置 if(NULL == p->pNext || i>pos-1) { printf("没找到删除结点的位置!\n"); return; } PNODE q = p->pNext;//将q指向需要删除的结点 p->pNext = q->pNext;//将p指向需要删除的结点的后一个结点(删除了q所指向的结点) free(q);//清空指针q指向的结点 q = NULL; }
执行结果:
链表《4》删除链表中的结点
时间: 2024-09-29 22:24:51