純手工打造C++單鏈表,實現增刪改查等基本功能

一直以來,對於數據結構都是後怕,但還是要啃下這骨頭的:

#pragma once

/*
* Copyright (c) 侯文斌
* All rights reserved.
* 
* 作 者:[email protected]
* 摘 要:鏈表的操作
*/

//帶頭節點的鏈表
class LinkedList
{
	struct Node
	{
	public:
		int data;
		Node* prev;
		Node* next;
	public:
		Node(){
			data = -1;
			prev = nullptr;
			next = nullptr;
		}
	};
public:
	LinkedList();
	~LinkedList();

public:
	void Reset();
	bool isEmpty();
	void Insert(int data, int key=-1);
	void Delete(int data);
	void Modify(int key, int data);
	Node* Find(int data);

	void Print();//打印鏈表

private:
	Node* head;
	Node* tail;
};

#include "LinkedList.h"
#include <iostream>


LinkedList::LinkedList()
{
	head = new Node();

	std::cout << sizeof(head) << " " << sizeof(Node) << std::endl;//x64指針8字節

	tail = head;//增加尾指針,方便追加
}

LinkedList::~LinkedList()
{
	Reset();
	if (head){
		delete head;
		head = nullptr;
	}
	tail = nullptr;
}

void LinkedList::Reset()
{
	Node* pNode = head->next;
	while (pNode)
	{
		Node* pTemp = pNode;
		pNode = pNode->next;
		//注意順序!!!
		delete pTemp;
		pTemp = nullptr;
	}
}

bool LinkedList::isEmpty()
{
	if (head && head->next == nullptr){
		return true;
	}
	return false;
}

void LinkedList::Insert(int data, int key)
{
	Node* pTemp = tail;
	if (key == -1){//追加
		pTemp = tail;
	}
	else {//指定位置
		pTemp = Find(key);
                pTemp->prev = nullptr;//重置標識
	}

	Node* pNew = new Node();//新增節點
	pNew->data = data;
	pNew->next = nullptr;

	if (key == -1){//追加
		pTemp->next = pNew;
		tail = pNew;//尾指向最新節點
	}
	else{//插入
		pNew->next = pTemp->next;
		pTemp->next = pNew;
	}
}

void LinkedList::Delete(int data)
{
	Node* pNode = Find(data);
	if ( pNode ){
		//前一個位置怎麼找,查找時通過pNode->prev返回
		pNode->prev->next = pNode->next;//刪除操作
		//回收空間
		delete pNode; pNode = nullptr;
	}
}

void LinkedList::Modify(int key, int data)
{
	Node* pNode = Find(key);
	if (pNode){
		pNode->data = data;
                pTemp->prev = nullptr;//重置標識
	}
}

LinkedList::Node* LinkedList::Find(int data)
{
	Node* pTemp = head->next;
	Node* pPrev = head;
	while ( pTemp )
	{
		if (pTemp->data == data){
			break;
		}
		pPrev = pTemp;
		pTemp = pTemp->next;
	}
	pTemp->prev = pPrev;//記錄該節點前一節點
	return pTemp;
}

void LinkedList::Print()
{
	Node* pTemp = head->next;
	while ( pTemp )
	{
		std::cout << pTemp->data << " ";
		pTemp = pTemp->next;
	}
	std::cout << std::endl;
}


int main(void)
	//鏈表的操作
	std::cout << "-----鏈表操作演示-----" << std::endl;
	LinkedList directList;
	std::cout << sizeof(directList) << " empty:" << directList.isEmpty() << std::endl;
	directList.Insert(1);
	directList.Insert(3);
	directList.Insert(5);
	directList.Insert(7);

	std::cout << "empty:" << directList.isEmpty() << std::endl;

	directList.Print();
	directList.Insert(10,3);//在節點3後面添加10
	directList.Print();

	directList.Modify(7,9);//修改節點
	directList.Print();

	directList.Delete(5);//刪除節點
	directList.Print();

	system("pause");
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章