文章目录
不带头节点单链表
链表是最简单的链式结构,单链表即单向链表,节点只存下一个节点的地址,这样“手拉手”形成单链表。单链表的组成元素是链表节点,节点存在值元素和下一个节点的地址。
下面是链表节点对象和链表对象的对象关系图:
单链表实现:
#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函数的缺省参数出错。
解决方案:
既可以在类的声明中,也可以在函数定义中声明缺省参数,但不能既在类声明中又在函数定义中同时声明缺省参数。