`
heglase
  • 浏览: 3318 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

c++ 单链表

 
阅读更多
#ifndef _linknode_h_
#define _linknode_h_
class Node {
private:
  Node* pNext;
  void*  pData;

public:
  Node(void* pData);
  ~Node();

  bool equals(const Node& node) ;
  Node* next();
  void setNext(const Node& node);
  void* data()const ;
};

class SingleLinkedList {
private:
  Node* head;
  Node* tail;

public:
  SingleLinkedList();
  ~SingleLinkedList();

  void push_front(void* data);
  void push_back(void* data);
  void remove(void* data);
  void display();
};

#endif

 ---------------------

#include "link.h"
#include <iostream>

using namespace std;



int main()
{
	int a=5,b=1,c=2,d=5,e=9;
	Node n(&a);
	Node n2(&b);
	Node* n3=new Node(&a);
	Node* n4=new Node(&d);
	//cout<<n.equals(n)<<endl;
	cout<<n4->equals(*n3)<<endl;
	cout<<*(int*)(n.data())<<endl;
	n.setNext(n3);
	cout<< *(int*)(n.next()->data())<<"-------以上是测试Node--------"<<endl;
	SingleLinkedList  link ;
	  link.push_front(&a);
	  link.push_front(&b);
	  link.push_front(&e);
	  link.push_back(&c);
	  link.remove(&d);
	  link.display();
	return 0;
}

Node::Node(void* pData):pData(pData),pNext(NULL)
{

}
Node::~Node()
{
}

bool Node::equals(const Node& node)
{
	int* idata=	(int*)pData;
	int* ndata=	 (int*)(node.data());
	if((*idata)==(*ndata))
		return true;
	else
		return false;
}

void* Node::data()const  
{
	return  pData;
}

void Node::setNext(const Node& node)
{
	this->pNext=const_cast<Node*>(&node);
}

Node* Node::next()
{
	return  pNext;
}

SingleLinkedList::SingleLinkedList():head(0),tail(0)
{

}

SingleLinkedList::~SingleLinkedList()
{
	 Node* tmp=head;
	while(tmp!=NULL){
		tmp->~Node();
	  
	 tmp = tmp->next();   
	} 
}

void SingleLinkedList::display()
{
	Node* tmp=head;
	while(tmp!=NULL){
		 cout<< *(int*)(tmp->data())<<endl;
	     tmp = tmp->next();   
	}

	  
	
}

void SingleLinkedList::push_front(void *data)
{
	Node* node=new Node(data);
	
	if(this->head==NULL)
	{
		this->head=node;
		this->tail=node;
		cout<<"在空链表中插入了个头结点"<<endl;
	}
	else{
		 node->setNext(*head);
		 
		this->head= node;
		//cout<<"非空链表"<<endl;
	}
	cout<<"从前面插入一个结点"<<*(int*)data<<endl;
}

void SingleLinkedList::push_back(void* data)
{
	Node* node=new Node(data);
	if(this->tail==NULL)
	{
		this->head=node;
		this->tail=node;
	}
	else{
		 
		this->tail->setNext(*node);
		tail=node;	  
		 
	}
	cout<<"从后面插入一个结点"<<*(int*)data<<endl;
}

void SingleLinkedList::remove(void* data)
{	//Node* currentData=new Node(data);隐式转化
	Node* temp=this->head;
	Node* preNode=NULL;
	 
	while(temp!=NULL)
	{
		 
		if(temp->equals(data))
		{
			if(temp==this->head){
				cout<<"不好, head结点"<<*(int*)temp->data()<<"要被删掉了"<<endl;

				this->head=temp->next();
			 
				temp->~Node();
			}else
			{
				preNode->setNext(*(temp->next()));
				temp->~Node();
			}
			return;
			 
		}
		 
		 preNode=temp;
		temp=temp->next();
		 
	}
}

 

分享到:
评论

相关推荐

    C++ 单链表反转 C++ 单链表反转

    总结来说,这段C++代码演示了如何通过迭代方式反转一个单链表。这种算法的时间复杂度是O(n),其中n是链表的长度,因为它只遍历一次链表。空间复杂度为O(1),因为我们仅使用了常数个额外的指针变量。理解这个过程对于...

    C++单链表选择排序

    以下是一个简单的C++单链表选择排序的实现: ```cpp #include "sort.h" void selectionSort(ListNode*& head) { if (head == nullptr || head-&gt;next == nullptr) { return; } ListNode* minNode = head; ...

    C++单链表的基本操作

    c++单链表的基本操作

    C++单链表的实现(包含一些最基本的函数)

    C++单链表的实现,包含Create(),Print(const node *head),Delete(node *head,int num)等简单的函数

    C++单链表实现大数加法

    C++单链表实现大数加法 大数加法是一种常见的算法问题,特别是在C++中实现大数加法时需要考虑到数字的位数和溢出问题。使用单链表来实现大数加法可以解决这个问题。本文将详细介绍如何使用C++单链表实现大数加法。 ...

    C++单链表实现的图书管理系统

    在本项目"C++单链表实现的图书管理系统"中,主要涉及了数据结构中的单链表概念以及如何利用C++编程语言设计一个简单的图书管理软件。这个系统通过单链表来存储图书信息,并且实现了文件操作,使得图书数据能够持久化...

    C++单链表实现源码

    // 以下是自己写的基于C++的双向循环链表的创建及其一些操作与实现(于VC下通过),没用模板, // 也没用类,所以比较适合有一点C++语言基础入门者,但可移植不够.有什么bug的话,欢迎指出。 // 或有什么问题也可以联系...

    c++单链表基本操作的实现

    1、单链表基本操作的实现 [问题描述]要在带头结点的单链表h中第i个数据元素之前插入一个数据元素x ,首先需要在单链表中寻找到第i-1个结点并用指针p指示,然后申请一个由指针s 指示的结点空间,并置x为其数据域值,...

    c++ 单链表的逆序排列 正确

    单链表的逆序排列,用的是c++语言的,程序正确能够运行,易懂

    C++单链表类模板 模板

    在这个“C++单链表类模板”中,我们将探讨如何利用C++的类模板来实现一个通用的单链表数据结构,并讨论其核心功能和设计思路。 首先,我们需要定义一个链表节点。节点通常包含两个部分:一个是存储数据的成员变量,...

    自己写的c++单链表操作

    c++单链表的设计与实现。采用c++类实现单链表,而不是结构体。

    c++单链表实现功能

    根据给定的文件信息,我们可以总结出以下关于C++单链表实现的关键知识点: ### 1. 序列列表(SeqList)类定义 #### 类模板定义 ```cpp template class SeqList { // 类成员声明 }; ``` - `template &lt;class T&gt;`:...

    C++单链表的创建插入、删除

    用c++创建单链表、单链表的删除、单链表的插入、求单链表的长度

    数据结构 通讯录管理 课程设计C++单链表版

    在本课程设计中,我们关注的是“数据结构 通讯录管理 课程设计C++单链表版”,这是一项以C++编程语言实现的项目,它利用了数据结构中的单链表来有效地管理通讯录信息。单链表是计算机科学中基础且重要的数据结构之一...

    C++单链表模版(逆置、插入。。。。。。)

    总的来说,这个C++单链表模版提供了一套全面的链表操作接口,对于学习数据结构和C++编程的人来说,是一个很好的实践和参考资源。通过使用和改进这个模版,可以深入理解链表数据结构和C++面向对象编程的概念。

    C++单链表的创建方法

    C++单链表的创建方法,包括头插法、尾插法

    C++ 单链表实现多项式乘法

    ### C++ 单链表实现多项式乘法 #### 实习任务及需求分析 本次实习的任务是使用C++编程语言,通过单链表的数据结构来实现两个多项式的相乘操作。这一过程涉及到对多项式的理解、单链表的运用以及算法的设计与优化。...

    C++单链表的小程序(新手学习用)

    本文将详细解析C++中的单链表,并结合提供的“C++单链表小程序”进行讲解,适合大一新生作为学习材料。 单链表是链表的一种类型,每个节点包含两部分:数据域和指针域。数据域存储实际的数据,而指针域存储指向下一...

    集合的运算(C++单链表实现).zip

    通过以上步骤,我们就可以实现C++单链表对集合的交、并、差运算,并实现从文件读取和保存结果的功能。这样的实现既锻炼了对链表的理解,也展示了对文件操作的掌握,是数据结构和算法应用的一个好例子。

    C++单链表类(实现丰富)

    总的来说,`C++单链表类(实现丰富)`的学习涵盖了链表的基本操作和高级应用,是数据结构和算法学习的重要组成部分。通过深入研究`LLink`类的源代码,你可以更深入地了解链表的工作原理,并提升在实际项目中的应用...

Global site tag (gtag.js) - Google Analytics