头文件:定义节点和链表数据类型。实现构造、插入、删除等操作。
#pragma once
#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;
struct linknode
{
int val;
linknode* next;
};
class linklist
{
public:
linklist();
~linklist();
bool insert(int); //尾插 值为int
bool insert(int, int);
bool erase(int); //删除第i个节点
void print(void);
int getsize();
void reverse();
private:
linknode* head;
int size;
};
linklist::linklist()
{
size = 0;
head = new linknode;
head->next = NULL;
head->val = 0;
}
linklist::~linklist()
{
if (size == 0)
return;
linknode* cur = head->next;
while (cur)
{
head->next = cur->next;
linknode* nex = cur->next;
delete cur;
cur = nex;
}
size = 0;
}
//尾插
bool linklist::insert(int val)
{
linknode* nd = new linknode;
nd->val = val;
nd->next = NULL;
linknode* cur = head->next;
linknode* pre = head;
while (cur)
{
pre = cur;
cur = cur->next;
}
pre->next = nd;
size++;
return true;
}
//在第pos个位置插入节点,值为val
bool linklist::insert(int pos, int val)
{
if (pos > size)
{
cout << "越界,未能插入第" << pos << "个" << "节点" << endl;
return false;
}
linknode* nd = new linknode;
nd->val = val;
int tmp = size;
linknode* pre = head;
linknode* cur = head->next;
for (int i = 0; i <= tmp; i++)
{
if (pos == i)
{
pre->next = nd;
nd->next = cur;
size++;
break;
}
pre = cur;
cur = cur->next;
}
return true;
}
//删除第pos个节点
bool linklist::erase(int pos)
{
if (pos > size)
{
cout << "越界,未能删除第"<<pos<<"个"<<"节点" << endl;
return false;
}
int tp = size;
linknode* pre = head;
linknode* cur = head->next;
linknode* nex = cur->next;
for (int i=0;i<tp;i++)
{
if (pos == i)
{
pre->next = cur->next;
delete cur;
size--;
break;
}
pre = cur;
cur = cur->next;
}
return true;
}
void linklist::print(void)
{
if (head->next == NULL)
{
cout << "链表为空" << endl;
return;
}
else
{
linknode* cur = head->next;
while (cur)
{
cout << cur->val << "->";
cur = cur->next;
}
cout << endl;
}
}
int linklist::getsize()
{
return size;
}
void linklist::reverse()
{
if (head->next == NULL)
{
return;
}
linknode* pre = head->next; //第0个节点
linknode* cur = pre->next; //第1个节点,cur可能是个空指针
pre->next = NULL;
while (cur)
{
linknode* nex = cur->next;
cur->next = pre;
pre = cur;
cur = nex;
}
head->next = pre;
}
.C文件:测试成员函数功能
#include <iostream>
#include "linklist.h"
using namespace std;
int main()
{
//测试插入
linklist L;
L.insert(0);
L.insert(1);
L.insert(2, 2);
L.insert(3);
cout << "链表节点个数: "<<L.getsize() << endl;
L.print();
//测试删除
L.erase(1);
cout << "删除节点后链表节点个数: "<<L.getsize() << endl;
L.print();
//测试反转链表
L.reverse();
cout << "反转链表后:" << endl;
L.print();
return 0;
}