- 方式1:
- 删除单向链表头结点后的结点,即
头删法
,代码如下: - 示例代码:
int delete_link_list_1(node_t *phead){if(NULL == phead){printf("入参为NULL\n");return -1;}if(NULL == phead->next){printf("链表只有一个头结点,无其他的结点\n");return -1;}node_t *pdel = phead->next;phead->next = pdel->next;free(pdel);pdel = NULL;return 0;}
- 操作步骤:
- 1.定义待删结点
pdel
,并将待删结点的地址指向头结点的指针域,备份待删结点,即node_t *pdel = phead->next
; - 2.头结点的指针域指向待删结点后的结点的地址,即
phead->next = pdel->next
; - 3.用free函数释放待删结点所占用的空间,即
free(pdel)
; - 4.防止野指针产生,给待删结点的地址赋值NULL,即
pdel = NULL
; - 方式2:
- 删除单向链表的最后一个结点,即
尾删法
,代码如下: - 示例代码:
int delete_link_list_2(node_t *phead){if(NULL == phead){printf("入参为NULL\n");return -1;}if(NULL == phead->next){printf("链表只有一个头结点,无其他的结点\n");return -1;}//遍历链表,找到倒数第二个结点node_t *ptemp = phead;while(NULL != ptemp->next->next){ptemp = ptemp->next;}free(ptemp->next);ptemp->next = NULL;return 0;}
-
操作步骤:
-
1.利用
while循环
,遍历单向链表,找到倒数第二个结点
,即ptemp
; -
2.
释放ptemp的指针域,并赋值NULL
,这样就删除了链表的最后一个结点; -
方式3:
-
指定结点在链表中的位置,然后
根据位置,删除待删结点
,代码如下: -
示例代码:
int delete_link_list_3(node_t *phead,int pos){if(NULL == phead){printf("入参为NULL\n");return -1;}if(NULL == phead->next){printf("链表只有一个头结点,无其他的结点\n");return -1;}if(pos < 0){printf("删除位置不合理,删除失败\n");return -1;}node_t *ptemp = phead;int i = 0;for(i = 0; i < pos; i++){ptemp = ptemp->next;if(NULL == ptemp->next){break;}}if(i < pos){printf("删除位置不合理,删除失败\n");return -1;}node_t *pdel = ptemp->next;ptemp->next = pdel->next;free(pdel);pdel = NULL;return 0;}
- 操作步骤:
- 1.找到待删结点的前一个结点
ptemp
; - 2.定义待删结点,并指向待删结点前一个结点的指针域,备份待删结点,即
node_t *pdel = ptemp->next
; - 3.待删结点前一个结点的指针域指向待删结点的指针域,也就是待删结点后面那个结点的地址,即
ptemp->next = pdel->next
; - 4.用free函数释放待删结点所占用的空间,即
free(pdel)
; - 5.防止野指针产生,给待删结点的地址赋值NULL,即
pdel = NULL
;