C++类实现数据结构单链表

小白最近刚开始学习数据结构,用类实现了单链表
栈和队列。本文是单链表部分。

.h文件

#pragma once
#include<iostream>
using namespace std;

typedef int ElemType;

typedef struct LinkList
{
	ElemType data;   
	struct LinkList* next;
}LinkList;

class List
{
public:
	List(); 
	~List(); 

	//1、链表大小
	int GetSize(); 

	//2、尾插
	void push_backList(ElemType x);

	//3、头插
	void push_frontList(ElemType x);

	//4、尾删
	bool pop_backList();

	//5、头删
	bool pop_frontList();

	//6、插入(指定位置插入)
	bool insertList(ElemType x, int pos);

	//7、删除指定位置元素
	bool deleteList(int pos);

	//8、获得头地址
	LinkList* GetHead();

	//9、反转链表
	void reverseList();

private:
	LinkList* head;  //头指针
	int LIstSize;    

	void Reverse(LinkList* p);
};

.cpp文件

#include"LinkList.h"

//构造函数
List::List() {
	//初始化参数
	//head = (LinkList*)(new LinkList);
	head = NULL;
	this->LIstSize = 0;
}

//析构函数
List::~List() {

	//将节点数据全部清空
	while (head != NULL) {
		pop_frontList();
	}

}

//1、求链表大小
int List::GetSize() {
	return this->LIstSize;
}

//2、尾插
void List::push_backList(ElemType x) {
	LinkList* newNode= (LinkList*)(new LinkList);
	newNode->data = x;
	newNode->next = NULL;
	LinkList* temp = head; //遍历指针
	if (head == NULL) {
		head = newNode;
		this->LIstSize++;
		return;
	}
	while (temp->next != NULL) {
		temp = temp->next;
	}
	temp->next = newNode;
	this->LIstSize++;
	return;
}

//3、头插
void List::push_frontList(ElemType x) {
	LinkList* newNode = (LinkList*)(new LinkList);
	newNode->data = x;

	newNode->next = head;
	head = newNode;

	this->LIstSize++;
	return;
}

//4、尾删
bool List::pop_backList() {
	LinkList* temp = head;

	if (head == NULL) return false;

	while (temp->next->next != NULL) {
		temp = temp->next;
	}
	LinkList* temp1 = temp->next;
	temp->next = NULL;
	delete(temp1);

	this->LIstSize--;
	return true;
}

//5、头删
bool List::pop_frontList() {
	LinkList* temp = head;

	if (head == NULL) return false;

	head = head->next;
	delete(temp);
	this->LIstSize--;
	return true;
}

//6、插入(指定位置插入)
bool List::insertList(ElemType x, int pos) {
	LinkList* temp = head;
	LinkList* newNode = (LinkList*)(new LinkList);
	newNode->data = x;

	if (pos<0 || pos>this->LIstSize - 1) {
		return false;
	}
	else if (pos == 0) {
		this->push_frontList(x);
		return true;
	}

	//找到要插入位置的上一个节点
	for (int i = 0; i < pos - 1; i++){
		temp = temp->next;
	}

	LinkList* temp1 = temp->next;  

	//链接
	temp->next = newNode;
	newNode->next = temp1;

	this->LIstSize++;
	return true;
}

//7、删除指定位置元素
bool List::deleteList(int pos) {
	LinkList* temp = head;

	//判断链表是否为空
	if (head == NULL) 
		return false;
	else if (pos == 0) {    
		this->pop_frontList();
		return true;
	}

	//找到要插入位置的上一个节点
	for (int i = 0; i < pos - 1; i++) {
		temp = temp->next;
	}

	LinkList* temp1 = temp->next; 
	temp->next = temp->next->next;

	delete(temp1);
	this->LIstSize--;
	return true;

}

//8、获得头地址
LinkList* List::GetHead() {
	return this->head;
}

//9、反转链表(递归实现)
//递归函数
void List::Reverse(LinkList* p) {
	if (p->next == NULL) {
		head = p;  
		return;
	}
	Reverse(p->next);
	p->next->next = p; 
	p->next = NULL; 
}
//实现反转
void List::reverseList() {
	Reverse(head); 
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值