C++ 链表操作:增删改查和文件读写
#include
struct ListNode { int value; ListNode* next; };
struct List { ListNode* head; List() { head = nullptr; } };
bool addNode(List* plist, int nVal) { ListNode* newNode = new ListNode; newNode->value = nVal; newNode->next = nullptr;
if (plist->head == nullptr) {
plist->head = newNode;
} else {
ListNode* curr = plist->head;
while (curr->next != nullptr) {
curr = curr->next;
}
curr->next = newNode;
}
return true;
}
bool delNode(List* plist) { if (plist->head == nullptr) { return false; } else if (plist->head->next == nullptr) { delete plist->head; plist->head = nullptr; } else { ListNode* prev = nullptr; ListNode* curr = plist->head; while (curr->next != nullptr) { prev = curr; curr = curr->next; } delete curr; prev->next = nullptr; }
return true;
}
void traverseReverse(ListNode* node); void traverse(List* plist, int nDir) { if (plist->head == nullptr) { return; }
ListNode* curr = plist->head;
if (nDir == 0) {
while (curr != nullptr) {
cout << curr->value << ' ';
curr = curr->next;
}
} else {
traverseReverse(curr);
}
}
void traverseReverse(ListNode* node) { if (node == nullptr) { return; } traverseReverse(node->next); cout << node->value << ' '; }
void savelist(List* plist) { if (plist->head == nullptr) { return; }
ofstream file('data.txt');
if (file.is_open()) {
ListNode* curr = plist->head;
while (curr != nullptr) {
file << curr->value << endl;
curr = curr->next;
}
file.close();
} else {
cout << '无法打开文件' << endl;
}
}
void readlist(List* plist) { ifstream file('data.txt'); if (file.is_open()) { while (delNode(plist)) {} int nVal; while (file >> nVal) { addNode(plist, nVal); } file.close(); } else { cout << '无法打开文件' << endl; } }
bool delNode(List* plist, int nIdx) { if (plist->head == nullptr || nIdx < 0) { return false; } else if (nIdx == 0) { ListNode* temp = plist->head; plist->head = plist->head->next; cout << '删除节点 ' << temp->value << ' 成功。' << endl; delete temp; } else { ListNode* prev = nullptr; ListNode* curr = plist->head; int count = 0; while (curr != nullptr && count < nIdx) { prev = curr; curr = curr->next; count++; } if (curr != nullptr) { prev->next = curr->next; cout << '删除节点 ' << curr->value << ' 成功。' << endl; delete curr; } else { return false; } }
// 输出链表
traverse(plist, 0); // 正向遍历
cout << endl;
return true;
}
bool insertNode(List* plist, int nVal, int nIdx) { if (nIdx < 0) { return false; } else if (nIdx == 0) { ListNode* newNode = new ListNode; newNode->value = nVal; newNode->next = plist->head; plist->head = newNode; cout << '在索引 ' << nIdx << ' 处插入节点 ' << nVal << ' 成功。' << endl; } else { ListNode* prev = nullptr; ListNode* curr = plist->head; int count = 0; while (curr != nullptr && count < nIdx) { prev = curr; curr = curr->next; count++; } if (curr != nullptr || count == nIdx) { ListNode* newNode = new ListNode; newNode->value = nVal; newNode->next = curr; prev->next = newNode; cout << '在索引 ' << nIdx << ' 处插入节点 ' << nVal << ' 成功。' << endl; } else { return false; } }
// 输出链表
traverse(plist, 0); // 正向遍历
cout << endl;
return true;
}
int main() { List list;
int nCount = 0;
while (nCount < 10) {
int nVal;
cout << '请输入第' << nCount + 1 << '个数:';
cin >> nVal;
addNode(&list, nVal);
nCount++;
}
int nIndex;
cout << '请输入要删除的节点索引:';
cin >> nIndex;
delNode(&list, nIndex);
cout << endl;
int nIdx, nVal;
cout << '请输入要插入的节点索引和值(用空格分隔):';
cin >> nIdx >> nVal;
insertNode(&list, nVal, nIdx);
cout<< endl;
// 遍历链表
traverse(&list, 0); // 正向遍历
cout << endl;
traverse(&list, 1); // 反向遍历
cout << endl;
// 保存链表到文件
savelist(&list);
// 从文件中读取链表
readlist(&list);
// 再次遍历链表
traverse(&list, 0); // 正向遍历
cout << endl;
traverse(&list, 1); // 反向遍历
cout << endl;
return 0;
原文地址: https://www.cveoy.top/t/topic/brfC 著作权归作者所有。请勿转载和采集!