#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) { 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;
C++ 链表操作:增删改查和文件读写

原文地址: https://www.cveoy.top/t/topic/brfC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录