如何用指针与动态结构实现字符串特定子串删除功能?
用指针与动态链表实现删除字符串中特定子串
问题分析
你需要实现扫描输入字符串并删除所有连续的pe子串,但现有代码存在两个核心问题:
- 第一段STL list版本逻辑错误:通过
i += 3截取子串的方式完全不符合需求,这是按固定间隔拆分字符串,而非扫描整个文本寻找pe。 - 第二段代码仅定义了空结构体和未完成的创建函数,缺少链表的核心逻辑实现。
下面是符合要求的**手动链表(指针+动态内存)**实现方案:
完整代码实现
#include <iostream> #include <string> using namespace std; // 定义链表节点结构:存储单个字符 + 下一个节点指针 struct Node { char ch; Node* next; // 构造函数简化节点创建 Node(char c) : ch(c), next(nullptr) {} }; // 从输入字符串创建链表 Node* createLinkedList(const string& input) { if (input.empty()) return nullptr; Node* head = new Node(input[0]); Node* current = head; for (size_t i = 1; i < input.size(); ++i) { current->next = new Node(input[i]); current = current->next; } return head; } // 删除链表中所有连续的"pe"子串 void removePeSubstring(Node*& head) { if (!head || !head->next) return; Node dummy(0); // 哑节点,简化头节点删除的处理 dummy.next = head; Node* prev = &dummy; while (prev->next && prev->next->next) { Node* first = prev->next; Node* second = first->next; // 检查当前两个节点是否是'p'和'e' if (first->ch == 'p' && second->ch == 'e') { // 删除这两个节点,释放内存 prev->next = second->next; delete first; delete second; // 不需要移动prev,因为新的next可能还是"pe" } else { prev = prev->next; } } head = dummy.next; // 更新头节点 } // 打印链表内容 void printLinkedList(Node* head) { Node* current = head; while (current) { cout << current->ch; current = current->next; } cout << endl; } // 释放链表内存,避免泄漏 void freeLinkedList(Node*& head) { Node* current = head; while (current) { Node* temp = current; current = current->next; delete temp; } head = nullptr; } int main() { string input; cout << "Enter your coded text: " << endl; getline(cin, input); Node* head = createLinkedList(input); removePeSubstring(head); printLinkedList(head); freeLinkedList(head); return 0; }
代码说明
- 链表节点结构:
Node结构体存储单个字符和下一个节点的指针,构造函数简化节点初始化。 - 链表创建:
createLinkedList遍历输入字符串,逐个生成节点并链接成完整链表。 - 删除"pe"子串:
- 使用**哑节点(dummy node)**避免处理头节点被删除的复杂情况。
- 遍历链表时,检查当前节点和下一个节点是否为
p和e,如果是则删除这两个节点并调整指针,同时释放内存。 - 删除后不移动
prev指针,因为新的后续节点可能仍组成pe。
- 内存管理:
freeLinkedList遍历链表释放所有节点内存,避免内存泄漏。 - 输入处理:使用
getline读取完整输入(包含空格),符合示例中的输入需求。
测试示例
输入:Hepello Ipe hapeve ape prpeobpelepem
输出:Hello I have a problem
内容的提问来源于stack exchange,提问作者Uncognito
相关产品推荐
相关产品推荐

