#include #include using namespace std; #define nullptr NULL 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) { int count = 0; ListNode* curr = plist->head; while (curr != nullptr && count < nIdx) { curr = curr->next; count++; } if (curr != nullptr) { ListNode* temp = curr; if (curr == plist->head) { plist->head = curr->next; } else { ListNode* prev = plist->head; while (prev->next != curr) { prev = prev->next; } prev->next = curr->next; } cout << "删除节点 " << temp->value << " 成功。" << endl; delete temp; return true; } else { cout << "索引 " << nIdx << " 超出链表长度。" << endl; return false; } } bool insertNode(List* plist, int nVal, int nIdx) { int count = 0; ListNode* curr = plist->head; while (curr != nullptr && count < nIdx) { curr = curr->next; count++; } if (curr != nullptr || count == nIdx) { ListNode* newNode = new ListNode; newNode->value = nVal; if (curr == plist->head) { newNode->next = plist->head; plist->head = newNode; } else { ListNode* prev = plist->head; while (prev->next != curr) { prev = prev->next; } newNode->next = curr; prev->next = newNode; } cout << "在索引 " << nIdx << " 处插入节点 " << nVal << " 成功。" << endl; return true; } else { cout << "索引 " << nIdx << " 超出链表长度。" << endl; return false; } } int main() { List list; int nCount = 0; int maxLength = 100; while (nCount < maxLength) { int nVal; cout << "请输入第" << nCount + 1 << "个数:"; cin >> nVal; addNode(&list, nVal); nCount++; } if (nCount == maxLength) { cout << "链表长度超过" << maxLength << ",节点数过大。" << endl; } 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;