這里分了四部分,不喜歡一堆堆代碼擠在一起的,開了個項目寫的這些代碼,我覺得是很通俗易懂的那種代碼了,具體鏈表實現的講解,以及對指針的運用,請移步各大教學視頻/文檔
代碼的具體解釋請看注釋喲~
[這里以下面代碼的刪除和插入為例,畫了個圖(也不知道夠不夠生動形象……我自己做的時候,就這么畫的整理思路的)建議看到相應的代碼再回來看這個]
1.List.h
#ifndef LIST_H_ #define LIST_H_ const int size = 40; //數據域 struct Data { char name[size]; int account; }; //結點 struct Node { Data data; Node *next; }; //管理結點的類 class NodeManager { private: int length; Node headNode; public: NodeManager();//對頭節點進行初始化 void addNode(Node *newNode);//添加結點 int findIndex(const char *name); void removeNode(const char *name);//刪除結點 Node* findNode(const char *_name); void insertNode(const char *_name, Node *newNode);//插入結點 void updateNode(const char *oldName, char *newName, double acc);//修改節點 void showNode() const;//查看結點 }; void Add(NodeManager* manager); void Remove(NodeManager* manager); void Insert(NodeManager* manager); void Update(NodeManager* manager); #endif
2.List.cpp
#include<iostream> #include<cstring> #include"list.h" NodeManager::NodeManager() { strcpy(headNode.data.name, ""); headNode.data.account = 0.0; headNode.next = NULL; length = 0; } void NodeManager::addNode(Node *newNode) { if(headNode.next==NULL) headNode.next = newNode; else { //創建臨時結點去遍歷 Node *temp = headNode.next; while(temp->next!=NULL) temp = temp->next; //直到遍歷到最后一個,也就是temp->next==NULL temp->next = newNode; newNode->next = NULL; } ++length; } int NodeManager::findIndex(const char *_name) { Node *temp = headNode.next;//從頭節點的指針開始找 int index = 0; while(temp!=NULL)//注意這里是temp,而不是temp->next { if(strcmp(temp->data.name, _name)==0) return index; else { ++index; temp = temp->next; } } //temp==NULL std::cout << "This guy's not on the list!\n"; return -1;//因為前面有可能index=0,所以這里是負數 } void NodeManager::removeNode(const char *_name) { int index = findIndex(_name); if(index==-1) return; else { Node *temp = &headNode;//要注意這里是頭節點 int s_index = 0;//開始遍歷的下標,也就是記錄temp指到第幾個了 while(temp->next!=NULL) { if(s_index==index) break; else { ++s_index; temp = temp->next; } } /* 注意這里,如果要刪除的數據是最后一個的話,就不能用下面那種: temp->next->next,這里會造成指針越界,因為next->next已經是NULL了 */ if(s_index==length) { temp->next==NULL; delete temp; } else//不是最后一個數據執行這里 { Node *nextNextNode = temp->next->next; /* 防止指針釋放不干凈,所以要將指針的地址指向NULL(只是地址,不影響內容) 比如你要添加一個新的節點放末尾 結果計算機又分配到了這個被釋放的指針 而這時候又沒有初始化,則這個指針可能還指着某個節點 */ temp->next->next = NULL; delete temp->next; temp->next = nextNextNode; --length; } } } Node* NodeManager::findNode(const char *_name) { Node *temp = headNode.next; while(temp!=NULL) { if(strcmp(temp->data.name, _name)==0) return temp; else temp = temp->next; } //temp==NULL std::cout << "This guy's not on the list!\n"; return temp; } void NodeManager::insertNode(const char *_name, Node *newNode) { Node *temp = findNode(_name); if(temp==NULL) return ; else { newNode->next = temp->next; temp->next = newNode; ++length; } } void NodeManager::updateNode(const char *oldName, char *newName, double acc) {//其實這里的參數,可以跟上面的一樣,主要看后面Menu.cpp咋寫,就是交互問題,這里分兩種方法展示了 Node *temp = findNode(oldName); if(temp==NULL) return; else { strcpy(temp->data.name, newName); temp->data.account = acc; } } void NodeManager::showNode() const { if(length==0) { std::cout << "Empty!\n"; return; } using std::cout; Node *temp = headNode.next; for(int i=0; i<length; i++) { cout << "第" << i+1 << "個數據:\n" << " Name: " << temp->data.name << "\tAccount: " << temp->data.account << '\n'; temp = temp->next; } }
3.Menu.cpp
#include<iostream> #include"list.h" using std::cout; using std::cin; void Add(NodeManager* manager) { Node *temp = new Node; temp->next = NULL; cout << "請輸入用戶的姓名和賬戶密碼:\n"; cin.get(); cin.getline(temp->data.name, size); cin >> temp->data.account; manager->addNode(temp); cout << "Add successfully!\n"; } void Remove(NodeManager* manager) { char _name[size]; cout << "請輸入要刪除的用戶的姓名:"; cin.get(); cin.getline(_name, size); manager->removeNode(_name); cout << "Remove successfully!\n"; } void Update(NodeManager* manager) { char _name[size], nName[size]; int acc; cin.get(); cout << "請輸入要修改的用戶的姓名:"; cin.getline(_name, size); cout << "請輸入新的用戶名和密碼:\n"; cin.getline(nName, size); cin >> acc; manager->updateNode(_name, nName, acc); cout << "Update successfully!\n" ; }
4.main.cpp
#include<iostream>
#include"list.h"
int main()
{
using namespace std;
NodeManager* manager = new NodeManager;
bool isExit = true;
int input;
char _name[size];
while(isExit)
{
cout << "\t1.添加數據" << endl
<< "\t2.刪除數據" << endl
<< "\t3.修改數據" << endl
<< "\t4.查看數據" << endl
<< "\t5.退出" << endl
<<"--------------------------------------" << endl;
while(!(cin>>input))
{
cin.clear();
while(cin.get() != '\n')
continue;
cout << "請重新輸入!\n" ;
}
system("cls");
switch(input)
{
case 1:
Add(manager);
break;
case 2:
Remove(manager);
break;
case 3:
Update(manager);
break;
case 4:
manager->showNode();
break;
case 5:
isExit = false;
break;
default:
cout << "請重新輸入!" << endl;
}
}
}
有什么問題歡迎來提問鴨~
也歡迎各位大佬們前來指正!
學了一天耶……emm果然是我太蠢了,所以各位大小可愛們給個贊嘛?
2020-05-26
22:39:42