- 最近在考研复习,看的王道的书,但是书里【用头插法建立带头结点的单链表】用的C语言和C++的混合用法,对于没学C直接C++的我,看起来非常吃力,于是自己写了纯C++的代码。
- 我用Node类和List类来实现单链表,其中Node类不一定用class,可以用struct来替代,因为该类没有函数要调用;List类有函数,所以用class不用strcut。
- 头结点的实现是在List的构造函数里,创建一个头结点,并且让head指针指向这个头结点。(head指针相当于有些教材中说的first指针)。使用头结点可以让头插法不用再考虑头指针的特殊处理,代码更加简化。
- 为了看得更清晰,分了模块,完整的代码在最后。
开头 & Node类
#include<iostream>
using namespace std;
typedef int Elemtype;
class Node {
public:
Elemtype data;
Node* next;
};
List类的声明
class List
{
public:
List();
~List();
Node* head;
int mySize;
void HeadInsert();
void print();
private:
};
List类的函数实现
List::List()//构造函数,有创建头结点
{
head = new Node();
head->data = 0;
head->next = NULL;
mySize = 0;
}
List::~List()//析构函数
{
delete head;
}
void List::HeadInsert() {//头插法的实现
int x;
cin >> x;
while (x != 9999)
{
Node* pnew = new Node;
pnew->data = x;
pnew->next = head->next;
head->next = pnew;
mySize++;
cin >> x;
}
return;
}
void List::print(){//打印创建好的链表
Node* p = head;
while (p->next != NULL) {
cout << p->next->data << "->";
p = p->next;
}
cout << "NULL";
}
main函数
int main() {//头插法创建链表并打印
List *l1 = new List();
cout << "请输入需要按头插法插入的数据,输入9999结束" << endl;
l1->HeadInsert();
cout << "开始输出头插法建立的链表" << endl;
l1->print();
}
全部代码(复制粘贴后即可运行)
#include<iostream>
using namespace std;
typedef int Elemtype;
class Node {
public:
Elemtype data;
Node* next;
};
class List
{
public:
List();
~List();
Node* head;
int mySize;
void HeadInsert();
void print();
private:
};
List::List()
{
head = new Node();
head->data = 0;
head->next = NULL;
mySize = 0;
}
List::~List()
{
delete head;
}
void List::HeadInsert() {
int x;
cin >> x;
while (x != 9999)
{
Node* pnew = new Node;
pnew->data = x;
pnew->next = head->next;
head->next = pnew;
mySize++;
cin >> x;
}
return;
}
void List::print(){
Node* p = head;
while (p->next != NULL) {
cout << p->next->data << "->";
p = p->next;
}
cout << "NULL";
}
int main() {
List *l1 = new List();
cout << "请输入需要按头插法插入的数据,输入9999结束" << endl;
l1->HeadInsert();
cout << "开始输出头插法建立的链表" << endl;
l1->print();
}
参考:单链表C++实现代码