一直以來,對於數據結構都是後怕,但還是要啃下這骨頭的:
#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;
}