单链表(C++实现)

单链表(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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值