C++实现单链表

不带头节点单链表

链表是最简单的链式结构,单链表即单向链表,节点只存下一个节点的地址,这样“手拉手”形成单链表。单链表的组成元素是链表节点,节点存在值元素和下一个节点的地址。
在这里插入图片描述
下面是链表节点对象和链表对象的对象关系图:
在这里插入图片描述
单链表实现:

#include <iostream>

class Node
{
private:
	int val;
	Node *next;

public:
	Node(int val_);   //声明构造函数
	Node **getNext(); //通过接口获取下一个节点next指针
	int *getVal();    //获取节点值指针
	void setVal(int val);
};
//
//构造函数实现
Node::Node(int val_)
: val(val_), next(nullptr)
{
}
//通过接口获取私有数据next
Node **Node::getNext()
{
	return &next;
}
int *Node::getVal() //获取节点值
{
	return &val;
}

void Node::setVal(int val_)
{
	val = val_;
}
//
//
class singleList
{
	Node *head;

public:
	//创建单链表
	void createSingleList(int val);
	//插入节点
	void insertNode(Node *pos, int val); //往pos位置之前插入val
	//按顺序打印单链表节点值
	void printNode();
	//查找某个值的第一个节点
	Node *findNode(int val);
	void delNode(int val); //删除值为val的所有值
};

void singleList::createSingleList(int val = 0)
{
	head = new Node(val);
}

void singleList::insertNode(Node *pos, int val)
{
	Node *insert = new Node(val);
	if (pos == nullptr || head == pos) //表头插入
	{
		*insert->getNext() = head;
		head = insert;
	}
	else
	{
		Node *pre = nullptr;
		Node *cur = head;
		while (cur != pos)
		{
			pre = cur;
			cur = *cur->getNext();
		}

		cur = *pre->getNext();
		*pre->getNext() = insert;
		*insert->getNext() = cur;
	}
}
//查找节点
Node *singleList::findNode(int val)
{
	Node *ret = head;
	while (*ret->getVal() != val)
	{
		ret = *ret->getNext();
	}
	return ret;
}
void singleList::delNode(int val) //删除值为val的所有值
{
	Node *cur = head;
	Node *pre = nullptr;
	while (*head->getVal() == val)
	{
		head = *cur->getNext();
		cur = *cur->getNext();
	}
	while (cur != nullptr)
	{
		if (*cur->getVal() == val){
			*pre->getNext() = *cur->getNext();
		}
		pre = cur;
		cur = *cur->getNext();
	}
}

测试代码:

#include"singleList.h"

singleList sl;

void singleList::printNode(){
	Node*cur = head;
	while (cur != nullptr)
	{
		std::cout << *cur->getVal() << std::endl;
		cur = *cur->getNext();
	}
	std::cout << std::endl;
}

void findAndInsertTest(){
	sl.createSingleList(1);//创建链表
	sl.printNode();
	sl.insertNode(nullptr, 2);
	sl.insertNode(nullptr, 3);
	sl.insertNode(nullptr, 4);
	sl.printNode();

	Node* x = sl.findNode(3);//查找链表
	sl.insertNode(x, 10);//插入链表
	sl.printNode();
}
void delNodeTest(){
	sl.insertNode(nullptr, 10);//插入链表
	sl.printNode();
	sl.delNode(10);
	sl.printNode();
}

int main()
{
	findAndInsertTest();
	delNodeTest();
	system("pause");
}

C++对象构建与使用,error: taking address of temporary [-fpermissive]

class Node
{
private:
    int val;
    Node *next;

public:
    Node(int val_);  //声明构造函数
};
//
//构造函数实现
Node::Node(int val_)
    : val(val_), next(nullptr)
{
}

class singleList
{
public:
    //创建单链表
    void createSingleList(int val);
};

void singleList::createSingleList(int val = 0)
{
    head = &Node(val);
}

造成上述错误的原因是:临时对象不能取地址。修改createSingleList函数如下所示即可:

void singleList::createSingleList(int val = 0)
{
    head =  new Node(val);//堆上开辟节点
}

error: default argument given for parameter 1 of ‘’ [-fpermissive]

PS F:\C代码\public> g++ .\test.cpp
In file included from .\test.cpp:1:
.\singleList.h:45:46: error: default argument given for parameter 1 of 'void singleList::createSingleList(int)' [-fpermissive]
 void singleList::createSingleList(int val = 0)
                                              ^
.\singleList.h:38:10: note: previous specification in 'void singleList::createSingleList(int)' here
     void createSingleList(int val = 0);
          ^~~~~~~~~~~~~~~~

按照提示,找到该成员函数的声明和定义:

class singleList
{
public:
    //创建单链表
    void createSingleList(int val = 0);
};

void singleList::createSingleList(int val = 0)
{
    head = new Node(val);
}

对于createSingleList函数的缺省参数出错。
解决方案:
既可以在类的声明中,也可以在函数定义中声明缺省参数,但不能既在类声明中又在函数定义中同时声明缺省参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值