gpt4 book ai didi

c++ - 从单链循环列表中删除特定节点

转载 作者:行者123 更新时间:2023-11-28 06:41:46 24 4
gpt4 key购买 nike

我一直在弄清楚如何从文本文件“AHHHHHAAAAHHAAHAHHAHAAAHAAHHA”中删除所有“A”节点我已经能够编写删除节点函数,但它只专注于删除头部,但我希望这个函数是能够读取文件并删除所有“A”并仅打印出所有 H。这是我的删除节点函数

struct Node
{
char data;
Node* pPrev;
Node* pNext;
};

void deleteNode(Node * android)
{
Node * pTemp = android->pNext;
android->data = pTemp->data;
android->pNext = pTemp->pNext;
free(pTemp);
}

这是我在这里找到的另一个删除节点功能,我尝试修改,我认为它不会起作用。

void deleteNode2(Node * android)
{
Node * pNext;
Node * pHead;
Node * pTail;
Node * pTemp = android->pNext;

if(android->pNext == 'A')
{
pTemp = pNext;

if(pHead = pTail)
{
pHead = pTail = NULL;
}
else
{
pHead = pHead->pNext;
}
}
free(pTemp);
}

在 int main() 中

while( fscanf(pInFile, "%c", &c) != EOF)
{
appendNode( pTail, c);

// display the list
displayList( pTail->pNext);

};

cout << endl;
cout << "'A' got removed from the List." << endl << endl;

deleteNode2(pTail->pNext);
displayList(pTail->pNext);

最佳答案

if(android->pNext == 'A') 会给你一个编译错误:pNext is a Node*, and you want to compare data .将其替换为 if (android->pNext.data == 'A')

另一个问题是您在 if 条件表达式中进行赋值,而不是比较:if(pHead = pTail) 不会比较指针,而是将 pHead 赋值给 pTail 并求值如果 pTail 不为空,则为真(如输入 if 语句)。只需使用 == 运算符来解决这个问题。

然而,您的代码中还有更多问题。如果只剩下一个元素,deleteNode 将不起作用。并且程序中没有任何内容遍历列表以找到您要删除的所有节点。

假设您将这段代码放入您的主要功能中,您应该尝试这样的事情:

Node* deleteNode(Node* android)
{
if (android->next == android) { // only one element
free(android);
return NULL;
} else {
Node * pTemp = android->pNext;
android->data = pTemp->data;
android->pNext = pTemp->pNext;
free(pTemp);
return android;
}
}

size_t listSize(const Node* pNode) {
if (!pNode) return 0;
const Node* pStart = pNode;
size_t n = 0;
do {
pNode = pNode->pNext;
n++;
} while (pNode != pStart);
return n;
}

Node * pTemp = pTail;
size_t len = listSize(pTail);
for (unsigned int i = 0 ; i < len ; i++) {
if (pTemp.data == 'A') {
pTemp = deleteNode(pTemp);
} else {
pTemp = pTemp->next;
}
}

这是一个比看起来更艰难的挑战,因为我们正在处理一个循环列表。这是知道何时停止循环的问题。在这种情况下,我只是在程序开始删除节点之前计算节点数。第一次遍历是安全的,因为它不会修改列表。我已经对此进行了重大更改,但如果有人发现有问题,我会很高兴知道。

只是为了完成答案:循环链表可能是一个要求,但如果您只是阻止程序附加“A”字符,您可以使事情变得很多更容易。同样,这取决于您的最终目标和要求。

关于c++ - 从单链循环列表中删除特定节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25838833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com