小白最近刚开始学习数据结构,用类实现了单链表
栈和队列。本文是单链表部分。
.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);
}