• 在不带头结点的单链表中删除特定元素


           在不带头结点的单链表中删除特定元素,一种很麻烦的情况是首结点即要删的结点,所以往往标识一个链表的 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 *&) 达到同样的目的,我觉得指针和引用的本质是一样的。




  • 相关阅读:
    启动hbase时出现HMaster Aborted错误
    kylin的安装与配置
    【转】HBase原理和设计
    ts项目报错:Import sources within a group must be alphabetized
    TypeScript 之 tsconfig.json
    TypeScript 之 声明文件的结构
    TypeScript 之 声明文件的使用
    TypeScript 之 声明文件的发布
    TypeScript 之 NPM包的类型
    create-react-app-typescript 知识点
  • 原文地址:https://www.cnblogs.com/riskyer/p/3353211.html
Copyright © 2020-2023  润新知