網(wǎng)站首頁 編程語言 正文
基本知識點(diǎn)
注:數(shù)據(jù)結(jié)構(gòu)系列將持續(xù)更新,歡迎交流討論…
- 有頭鏈表和單項(xiàng)鏈表差不多是一種線性結(jié)構(gòu),只是比單項(xiàng)鏈表多一個(gè)不存儲(chǔ)數(shù)據(jù)的、用來操作鏈表的頭節(jié)點(diǎn);
- 優(yōu)點(diǎn):作數(shù)據(jù)的刪除、插入簡單;缺點(diǎn):數(shù)據(jù)查找慢
- 組成:數(shù)據(jù)域、頭節(jié)點(diǎn)、尾結(jié)點(diǎn)、后繼節(jié)點(diǎn)的一個(gè)指針域;
- 有頭鏈表,后繼指針指向下一個(gè)結(jié)點(diǎn);
- 學(xué)數(shù)據(jù)結(jié)構(gòu)的建議:學(xué)習(xí)每種結(jié)構(gòu)的時(shí)候,首先得清除它的結(jié)構(gòu),所以自己首先要清楚大概的結(jié)構(gòu),自己畫一畫;文中我會(huì)展示出部分圖片以供參考。
基本結(jié)構(gòu)
注:這三張圖分別是有頭鏈表的初始狀態(tài)(只有頭節(jié)點(diǎn)和尾結(jié)點(diǎn))、基本模型、插入時(shí)后進(jìn)行的操作
一般實(shí)現(xiàn)步驟
- 構(gòu)建數(shù)據(jù)模型;(以什么方式實(shí)現(xiàn)鏈表,結(jié)構(gòu)體、類等)
- 初始化頭節(jié)點(diǎn),尾結(jié)點(diǎn);
- 初始化結(jié)點(diǎn)參數(shù)/創(chuàng)建結(jié)點(diǎn);
- 用頭結(jié)點(diǎn)或尾結(jié)點(diǎn)來操作鏈接每個(gè)結(jié)點(diǎn),讓這些結(jié)點(diǎn)成為一個(gè)邏輯上相連接的鏈表;
- 注意點(diǎn):指針的先后指向要捋清楚,誰先指,誰后指;
- 建議:學(xué)編程就是學(xué)的一種思維,有的問題可以不必深究;
List.h文件代碼
#pragma once
//數(shù)據(jù)域數(shù)據(jù),包含一個(gè)學(xué)號,三門成績
typedef struct DATA
{
int number;
int score[3];
DATA* next;
}Data, * p_Data;
class System
{
public:
System();
~System();
p_Data initData();
p_Data createData(int number, int score_1, int score_2, int score_3);
void insertHData(p_Data data);
void insertTData(p_Data data);
bool deleteData(int delNum);
bool changeData(int oldNum,int newNum);
bool searchData(int seaNum);
void printData();
int Size();
protected:
p_Data m_head;
p_Data m_tail;
int m_curSize;
};
List.cpp文件
#include "List.h"
#include <iostream>
using namespace std;
System::System()
{
//初始化兩個(gè)結(jié)點(diǎn)
this->m_head = this->initData();
this->m_tail = this->initData();
m_head->next = m_tail;
this->m_curSize = 0;
}
System::~System()
{
//cout << "析構(gòu)了..." << endl;
if (m_head != nullptr)
{
delete m_head;
m_head = nullptr;
}
if (m_tail != nullptr)
{
delete m_tail;
m_tail = nullptr;
}
this->m_curSize = 0;
}
p_Data System::initData()
{
p_Data data = new Data;
data->next = nullptr;
data->number = 0;
for (int i = 0; i < 3; i++)
{
data->score[i] = 0;
}
return data;
}
p_Data System::createData(int number, int score_1, int score_2, int score_3)
{
p_Data newData = initData();
newData->number = number;
newData->score[0] = score_1;
newData->score[1] = score_2;
newData->score[2] = score_3;
return newData;
}
void System::insertHData(p_Data data)
{
//看上面的過程圖,插入結(jié)點(diǎn)的next先指,頭節(jié)點(diǎn)的next在指向插入結(jié)點(diǎn)
data->next = this->m_head->next;
m_head->next = data;
this->m_curSize++;
}
void System::insertTData(p_Data data)
{
//保證pLight指向尾結(jié)點(diǎn)的左側(cè)結(jié)點(diǎn)
p_Data pMove = m_head;
p_Data pLight = m_head;
while (pMove != m_tail)
{
pLight = pMove;
pMove = pMove->next;
}
data->next = pLight->next;
pLight->next = data;
this->m_curSize++;
}
bool System::deleteData(int delNum)
{
p_Data pMove = m_head->next;
p_Data pLight = m_head;
/*for (int i = 0; i < this->m_curSize; i++)
{
if (pMove->number == delNum)
{
pLight->next = pMove->next;
return true;
}
pLight = pMove;
pMove = pMove->next;
}*/
while (pMove != m_tail)
{
if (pMove->number == delNum)
{
pLight->next = pMove->next;
delete pMove;
pMove = nullptr;
m_curSize--;
return true;
}
pLight = pMove;
pMove = pMove->next;
}
return false;
}
bool System::changeData(int oldNum,int newNum)
{
p_Data pMove = m_head->next;
while (pMove != m_tail)
{
if (pMove->number == oldNum)
{
pMove->number = newNum;
return true;
}
pMove = pMove->next;
}
return false;
}
bool System::searchData(int seaNum)
{
p_Data pMove = m_head->next;
while (pMove != m_tail)
{
if (pMove->number == seaNum)
{
return true;
}
pMove = pMove->next;
}
return false;
}
void System::printData()
{
p_Data pMove = this->m_head;
while (pMove->next != m_tail)
{
pMove = pMove->next;
cout << pMove->number << "\t";
for (int i = 0; i < 3; i++)
{
cout << pMove->score[i] << "\t";
}
cout << endl;
}
}
int System::Size()
{
return this->m_curSize;
}
Main.cpp測試代碼
#include <iostream>
#include "List.h"
using namespace std;
int main()
{
System sys;
p_Data data_1 = sys.createData(192, 89, 90, 89);
p_Data data_2 = sys.createData(193, 79, 79, 79);
p_Data data_3 = sys.createData(194, 90, 99, 85);
p_Data data_4 = sys.createData(195, 85, 85, 85);
sys.insertHData(data_1);
sys.insertHData(data_2);
sys.insertTData(data_3);
sys.insertTData(data_4);
cout << "鏈表含有 " << sys.Size() << " 個(gè)數(shù)據(jù)..." << endl;
sys.printData();
cout << endl;
sys.deleteData(195);
sys.printData();
cout << endl;
sys.changeData(192, 198);
sys.printData();
if (sys.searchData(192))
{
cout << "含有該數(shù)據(jù)..." << endl;
}
else
{
cout << "沒有該數(shù)據(jù)..." << endl;
}
return 0;
}
尾插法指針的移動(dòng)
結(jié)語
這些內(nèi)容是我平時(shí)的所學(xué)知識的理解,數(shù)據(jù)結(jié)構(gòu)的內(nèi)容將持續(xù)更新,如文中有誤還請不吝賜教;歡迎評論區(qū)留言或私信討論。
原文鏈接:https://blog.csdn.net/qq_46282869/article/details/125947739
相關(guān)推薦
- 2022-11-08 Numpy安裝、升級與卸載的詳細(xì)圖文教程_python
- 2023-03-05 Kotlin協(xié)程低級api?startCoroutine與ContinuationIntercept
- 2023-01-12 解決Python報(bào)錯(cuò):SyntaxError:?invalid?character?‘,‘?(U+F
- 2022-08-25 python自動(dòng)化測試之破解圖文驗(yàn)證碼_python
- 2023-04-20 el-table多選+搜索
- 2022-11-03 C++構(gòu)造函數(shù)初始化列表的實(shí)現(xiàn)詳解_C 語言
- 2022-09-18 iOS?xcconfig編寫示例教程_IOS
- 2023-01-08 shell腳本操作postgresql的方法_PostgreSQL
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支