zoukankan      html  css  js  c++  java
  • 在不带头结点的单链表中删除特定元素

           在不带头结点的单链表中删除特定元素,一种很麻烦的情况是首结点即要删的结点,所以往往标识一个链表的 head 就会改变,而在删除函数中要改变客户端的 head,就必须传入 head 的地址,否则客户端的 head 永远不会改变,也就是说,若形参为 Node * 类型,修改的只是 head 的副本,这是C语言中的基础问题。这篇博客是我读了皓哥的这篇文章《Linus:利用二级指针删除单向链表》有感而写的。

    程序如下:

    /********************************************************************
    	created:	2013/10/06
    	created:	6:10:2013   0:18
    	file base:	main
    	file ext:	c
    	author:		Justme0 (http://blog.csdn.net/Justme0)
    	
    	purpose:	在不带头结点的单链表中删除特定元素(C语言描述)
    
    *********************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef char ElemType;
    
    typedef struct Node {
    	ElemType data;
    	struct Node *next;
    }Node;
    
    /*
    ** 功能		: 删除链表中所有数据域为 x 的结点
    ** ppNode	: 链表的首结点的地址的地址
    */
    void list_remove(Node **ppNode, ElemType x) {
    	Node *temp = NULL;	// 用于释放结点
    
    	for (; NULL != *ppNode; ) {
    		if ((*ppNode)->data == x) {
    			temp = *ppNode;
    			*ppNode = (*ppNode)->next;
    			printf("remove node: %c
    ", temp->data);
    			//	free(temp);
    			temp = NULL;
    		} else {
    			ppNode = &((*ppNode)->next);	// 成员指针
    		}
    	}
    }
    
    int main(int argc, char **argv) {
    	Node a = {'b', NULL};	// 链尾结点
    	Node b = {'a', &a};
    	Node *head = &b;		// 指向链表的头指针(不带头结点)
    
    	list_remove(&head, 'a');
    
    	system("pause");
    	return 0;
    }


    当然了,在C++中可以用引用 (Node *&) 达到同样的目的,我觉得指针和引用的本质是一样的。




  • 相关阅读:
    Spring 基础学习
    Swagger basics (one)
    Handsontable Basics V7(one)
    JavaScript 对象
    CSS 基础总结
    Shell Programming(three)
    Shell Programming(two)
    Shell Programming(one)
    HTML标签总结
    jQuery 基础
  • 原文地址:https://www.cnblogs.com/riskyer/p/3353211.html
Copyright © 2011-2022 走看看