简单的单链表c++实现
第一次写了一个单链表用了c++的类,非常简单的实现单链表。输出看着比较乱,但是可以反映代码的书写过程,写代码时的想法
大题思路:
1:先定义一个链表的节点 Node 包含一个数据data 和一个指向Node类型的指针。
2在定义一个ListNode的类来存放链表,类里定义了一个头节点指针Node* head 。
3开始写构造函数ListNode() 默认构造一个头结点 节点的data数据存放当前节点个数,然后写了一个方法size();就是返回head->data的值。
4然后为了方便刚创建出来的节点初始化所以写了一个createNode() 用来初始化新创建出来的节点。
4写一个输出所有的节点函数printAll();检测节点书否创建成功输出内容。
5 ,在逐步实现增删改查。写一个小的方法就去检测一下基本逻辑是否正确。
最后,代码的细节考虑不充分有问题的小伙伴欢迎指出,共同学习共同进步,欢迎大神指正!!!
//单链表在vs.2013上可以直接运行
#include<iostream>
using namespace std;
struct Node{//节点类
public:
int data;
Node* next;
};
class ListNode{//链表类
Node* head;
Node* temp;//临时变量
public:
ListNode();
Node* createNode(int data=0);
void printAll();
~ListNode();
int size(){ //返回当前节点个数
return head->data;
}
void pushNode(int data); //尾插一个节点
void pushNode(int num, int arry[]); //插入一个数组就是重载了一下上边的pushNode(int data);
int append(int num); //查找数字位置 查到返回所在的节点数,没有查到返回0
void printAppend(int num); //直接输出节点的位置 就是把append()封装了一下
void deleteNode(int num); //输入删除的节点号
void selestNode(int num,int data); //更改第num个节点的数据;改为data;
void selestValue(int data1, int data2); //把节点值为data1的数该为data2;
void printNode(int num); //输出第num个节点
void printValue(int data); //输出值等于data的节点
};
ListNode::ListNode(){
head = createNode();//创建一个头结点
}
Node* ListNode::createNode(int data){
temp = new Node;
temp->data = data;
temp->next = NULL;
return temp;
}
void ListNode::printAll(){
temp = head->next;
while (temp!=NULL)//这个地方是temp 而不是temp->next 否则的话少输出一项内容
{
cout << temp->data << endl;
temp = temp->next;
}
}
ListNode::~ListNode(){
//delete head;//错的,不能直接释放头结点指针会造成内存泄漏
/*应该是这样*/
temp = head;
while (head->next != NULL){
temp = head;
head = head->next;
delete temp;
}
delete head;
}
void ListNode::pushNode(int data){
//有了一个节点Head
temp=createNode(data);
Node*p = head;
while (p->next != nullptr)p = p->next;
p->next = temp;
p = temp;
head->data++;
}
void ListNode::pushNode(int num, int *arry){
for (int i = 0; i < num; i++){
pushNode(arry[i]);
}
}
int ListNode::append(int num){
int flag = 0;
temp = head->next;
while (temp->next != nullptr){
flag++;
if (temp->data == num)
return flag;
temp = temp->next;
}
return 0;
}
void ListNode::printAppend(int num){
if (!append(num))cout << "等于该数字的节点不存在" << endl;
else
{
cout << "查找的数字在第" << append(num) << "个节点" << endl;
}
}
void ListNode::deleteNode(int num){
Node * p = head;
for (int i = 0; i < num-1; i++){
p = p->next;
}
Node* temp1 = p;//暂时保存一下要删除节点前的节点。
p = p->next;//p就是要删除的节点
Node* temp2 = p->next;//把删除前的节点指向删除后的哪一个节点
delete temp1->next; //删除节点
temp1->next = temp2; //把删除前的节点的下一个指向的节点指向删除后的节点。
}
void ListNode::selestNode(int num, int data){
//
temp = head; int i = 1;
while (i < num){
temp = temp->next;
i++;
}
temp->data = data;
cout << temp->data << endl;
}
void ListNode::selestValue(int num, int data){
temp = head;
while (temp->data!=num){
temp = temp->next;
}
temp->data = data;
}
void ListNode::printNode(int num){
temp = head;
int i = 0;
while (i < num){
temp = temp->next;
i++;
}
cout <<"第"<<num<<"的值为"<< temp->data << endl;
}
void ListNode::printValue(int data){
temp = head; int i = 0;
while (temp->next != NULL){
if (temp->data == data){
cout << "等于" << data << "的节点为第" << i<<"个节点"<< endl;
}
i++;
temp = temp->next;
}
}
void main(){
ListNode list1;//默认创建个节点保存节点个数10个
cout << "节点个数:" << list1.size() << endl;
list1.pushNode(1); //插入一个节点
list1.pushNode(2);
list1.pushNode(5);
int arr[10]{6, 2, 3, 4, 3}; //pushNode(10,int &arry[])
list1.pushNode(10,arr); //插入一个数组
list1.printAll(); //打印所有的节点的值
list1.printAppend(4); //查找数字值为4的节点是第几个节点
list1.deleteNode(3); //删除第三个节点就删除值为5的那个节点;
list1.printAll();
list1.selestNode(5, 5); //把第五个节点修改为5
list1.printAll(); //打印节点信息
cout << "等于2的改为12" << endl;
list1.selestValue(2, 12);// 感觉很费劲每次都输出所有,写一个输出对应节点的方法
list1.printAll(); //打印所有节点的数据
list1.printNode(3); //打印第三个节点的数据
list1.printValue(3); //打印值为3的数据的节点
system("pause");
}