1. 构造链表
链表中的每一个节点包含数据域和指针域 (构造在一个 struct 中),数据变量存储数据,指针变量存储下一个节点的地址。
链表的一个节点只能有一个后继
特点:
链表节点在内存中的位置可以不连续。
思路:
用 struct
包装节点 :成员包括数据和地址
用 class
包装链表 :成员有 head(一个指针变量)
struct node {
// pointor
node * next;
// data
int data;
node(){next = NULL;data = 0;}
};
class list {
public:
node * head;
node * checker; // 跟踪节点
public:
list();
~list();
void appendNode(int val); //尾部插入
void appendNode(const int &pos,const int &val); //随机插入
void print() const;
void removeNode(int val);
};
2.完整代码
#include <iostream>
using namespace std;
struct node {
// pointor
node * next;
// data
int data;
node(){next = NULL;data = 0;}
};
class list {
public:
node * head;
node * checker; // 跟踪节点
int count;
public:
list();
~list();
void appendNode(int val); //尾部插入
void appendNode(const int &pos,const int &val); //随机插入
void print() const;
void removeNode(int val);
int size(){return count;}
};
int main()
{
list list1;
int count;
cout << "create list 0~9" << endl;
list1.appendNode(0);
list1.appendNode(1);
list1.appendNode(2);
list1.appendNode(3);
list1.appendNode(4);
list1.appendNode(5);
list1.appendNode(6);
list1.appendNode(7);
list1.appendNode(8);
list1.appendNode(9);
list1.print();
cout << "--------" << endl;
cout << "delete 0" << endl;
list1.removeNode(0);
list1.print();
cout << "--------" << endl;
cout << "delete 5" << endl;
list1.removeNode(5);
list1.print();
cout << "--------" << endl;
cout << "delete 9" << endl;
list1.removeNode(9);
list1.print();
count = list1.size();
cout << "the number of elements are : " <<count << endl;
return 0;
}
list::list() {
head = NULL;
checker = NULL;
count = 0;
}
list::~list()
{
node * temp = NULL;
while(head != NULL) {
temp = head;
head = head->next;
delete temp;
}
}
void list::appendNode(int val)
{
node * temp = new node;
temp->data = val;
temp->next = NULL;
if(head == NULL) {
head = temp;
count++;
}
else {
checker = head;
while(checker->next != NULL) {
checker = checker->next;
} //寻找尾部节点
checker->next = temp;
count++;
}
}
void list::appendNode(const int &pos, const int &val)
{
node * previous = nullptr;
node * current = head;
node * temp = new node;
temp->data = val;
temp->next = NULL;
if (pos == 0 || pos == 1) {
temp->next = head;
head = temp;
count++;
return;
}
int i;
for(i = 0; i < pos - 1; i++) {
previous = current;
current = current->next; //current 一开始在头节点位置
}
previous->next = temp;
temp->next = current;
count++;
}
void list::print() const
{
node * worker = head;
while(worker != NULL) {
cout << worker->data << " ";
worker = worker->next;
}
cout << endl;
}
void list::removeNode(int val)
{
if(head == NULL) {
cout << "error, list does not exist" << endl;
return;
}
//寻找尾部节点
node * tail = head;
node * previous = NULL;
node * temp = NULL;
node * current = head;
//用双指针找到了尾部节点
while(tail->next != NULL) {
previous = tail;
tail = tail->next;
}
//删除头部节点
if(head->data == val) {
temp = head;
head = head->next;
delete temp;
count--;
}
//删除尾部节点
else if(tail->data == val) {
//fixme:
previous->next = NULL;
delete tail;
count--;
}
// 删除中间节点
else {
previous = NULL;
while (current != NULL) {
if(current->data == val) {
break;
}
else {
previous = current;
current = current->next;
}
}
if(current != NULL) {
temp = current;
previous->next = current->next;
delete temp;
}
else {
cout << val << " is not exist in the list." << endl;
}
count--;
}
}
3. 测试结果
4. 总结问题
完成一个单链表的设计需要解决的问题如下:
head
怎么创建?list
类中的成员变量和方法都有哪些?- 双指针怎么设计?
- 用C语言写的时候最后如何释放空间?