单链表(C++实现)
head.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <ctime>
#include <string>
using namespace std;
class Node
{
public:
int data;
Node* next;
};
class LinkList
{
public:
LinkList(); //构造
void Insert(int data); //插入
void Print(); //浏览
void popByPos(int pos); //根据位置删除
void popByData(int data); //根据值删除
void Modify(int data); //根据值修改
int Find(int data); //根据值查找(返回位置)
Node* getLinkListEnd(); //返回尾结点
Node* getLinkListHead(); //返回第一个有效结点
void Sort(Node* low, Node* high); //排序
~LinkList(); //析构
private:
Node* head;
};
function.cpp
初始化:
#include "head.h"
LinkList::LinkList()
{
this->head = new Node();
this->head->next = NULL; //头结点初始下一个地址为空
this->head->data = INT_MAX; //头结点数据为int类型最大值
}
插入(头插):
void LinkList::Insert(int data)
{
Node* temp = new Node();
temp->next = this->head->next; //链接结点
temp->data = data;
this->head->next = temp;
}
浏览:
void LinkList::Print()
{
if (this->head->next != NULL)
{
int increment = 1; //设置一个增量,每输出5个数换一次行
Node* p = this->head->next; //临时指针
while (p != NULL)
{
cout << p->data << "\t";
if (increment % 5 == 0)
{
cout << endl;
}
p = p->next;
increment++;
}
}
cout << endl << endl;
}
根据位置删除:
void LinkList::popByPos(int pos)
{
if (this->head->next == NULL) //当表中无数据时,return
{
return;
}
else
{
Node* p1 = this->head;
Node* p2 = this->head->next; //定位到需要删除的位置
for (int i = 0; i < pos && p2->next != NULL; i++, p2 = p2->next, p1 = p1->next);
p1->next = p2->next;
delete p2;
}
}
根据值删除:
void LinkList::popByData(int data)
{
if (this->head->next == NULL)
{
return;
}
else
{
Node* p1 = this->head;
Node* p2 = this->head->next;
while (p2 != NULL)
{
if (p2->data == data) //当找到要删除的结点后,
{ //将前一个结点的next指向要删除的结点的下一个结点
p1->next = p2->next;
delete p2;
return;
}
else {
p1 = p1->next;
p2 = p2->next;
}
}
cout << "删除失败!" << endl;
}
}
根据值修改:
void LinkList::Modify(int data)
{
if (this->head->next == NULL)
{
return;
}
Node* p = this->head->next;
while (p != NULL)
{
if (p->data == data)
{
cout << "请输入要修改的值:";
cin >> p->data;
return;
}
p = p->next;
}
cout << "未找到该值。" << endl;
}
根据值查找,返回位置:
int LinkList::Find(int data)
{
if (this->head->next == NULL)
{
return -1;
}
Node* p = this->head->next;
int pos = 0;
while (p != NULL)
{
if (p->data == data)
{
return pos;
}
p = p->next;
pos++;
}
return -1;
}
返回头尾结点:
Node* LinkList::getLinkListHead() //返回第一个有效结点
{
return this->head->next;
}
Node* LinkList::getLinkListEnd() //返回尾结点
{
if (this->head->next == NULL)
{
return NULL;
}
Node* p = this->head->next;
while (p != NULL)p = p->next;
return p;
}
快速排序(从小到大):
将第一个有效结点的data作为’轴’(low),遍历链表,将小于’轴’的数据放在左边(只交换数据域)
void LinkList::Sort(Node* low, Node* high)
{
if (low == NULL || low == high) //如果头指针为空或者链表为空,直接返回
{
return;
}
int temp;
//q,p用来遍历的指针
Node* p = low->next; //p指向第一个有效结点的下一个结点
Node* q = low; //q指向第一个有效结点
while (p != high)
{
if (p->data < low->data) //对于小于轴的元素放在左边
{
q = q->next;
temp = q->data;
q->data = p->data;
p->data = temp;
}
p = p->next;
}
temp = low->data; //遍历完后,对左轴元素与q指向的元素交换
low->data = q->data;
q->data = temp;
this->Sort(low, q); //对左右进行递归
this->Sort(q->next, high);
}
析构:
LinkList::~LinkList()
{
if (this->head->next == NULL)
{
delete this->head;
}
else
{ //先释放头结点以外的内存,最后释放头结点
Node* p1 = this->head->next; //递进delete
Node* p2 = this->head->next->next;
while (p2->next != NULL)
{
if (p1 != NULL)
{
delete p1;
p1 = p2;
}
p2 = p2->next;
}
p1 = NULL;
delete p2;
p2 = NULL;
delete this->head;
}
}
main.cpp
#include "head.h"
int main(void)
{
srand((unsigned int)time(NULL));
const int MAX = 10;
LinkList list;
for (int i = 0; i < MAX; i++)
{
list.Insert(rand() % MAX);
}
list.Insert(666);
list.Print();
list.popByPos(0);
list.popByData(7);
list.Print();
list.Modify(6);
list.Print();
if (list.Find(8) != -1)
{
cout << "值为8的元素位置为:" << list.Find(8) << endl;
}
list.Sort(list.getLinkListHead(), list.getLinkListEnd());
list.Print();
system("pause");
return 0;
}