链表的插入和删除优于数组,不用移动元素,且易于实现长度扩充,但是查找较为困难。
双向链表的普通结点由信息、上一个结点的地址和下一个结点的地址组成。
在new的头文件中只包含6个重载的new和delete,和一些new的声明。iostream是C++中特定的输入输出流操作以及一些其他常用函数和操作符的声明。里面包含了new头文件的内容,一般只需要在C++程序开头加上"#include"和 using namespace std;这两句代码就可以了。不需要再另外加上new。
PS:
NULL 的弊端: NULL 终究只是一个宏。它是一个整型,而不是指针,所以一旦涉及类型转换就会有风险。因而随之带来的问题是,我们没有办法在不显示声明指针类型的情况下定义一个空指针。
自从C++11以来,有一个小特性完美的解决了这个问题—— nullptr 。作为一个字面常量和一个零指针常数,它可以被隐式转换为任何指针类型。而且可以向后兼容 0 和 NULL 。
#include<iostream>
#include<new>
using namespace std ;
struct ListNode
{
double value ;
ListNode *next ;
//构造函数
ListNode( double value1 , ListNode *next1 = nullptr )
{
value = value1 ;
next = next1 ;
}
//当仅指定其value部分,则后继指针默认为nullptr
}
//创建链表
ListNode *numberList = nullptr ;
double number ;
while( numberFile >> number )
{
numberList = new ListNode( number , numberList ) ;
//new开辟空间在堆上,出来的是一段空间的首地址
}
//遍历链表
ListNode *ptr = numberList ;
while( ptr != nullptr )
{
cout << ptr -> value << " " ;
ptr = ptr -> next ;
}