【问题标题】:Doubly linked list trying to delete selected node双向链表试图删除选定的节点
【发布时间】:2018-09-18 03:38:26
【问题描述】:

我正在尝试使用双向链表并从文本文件中读取来创建一个非常基本的缓存。目前缓存容量为 5,我从 txt 文件中读取了 20 个值,即值 1-20。当我尝试删除头部然后打印链表时,它会打印 0,2,3-20,因此将 1 替换为 0。 据我了解,我需要创建一个临时节点来设置头值,然后将头指向下一个节点,最后删除临时节点,这就是我所做的,但我显然错过了一些重要的东西.

int main(int argc, char** argv) {
node* head;
node* tail;
node* n;

int capacity = 5; 
int size = 0;

std::string fileName;   
std::ifstream inFile;

int start_block, num_blocks, ignore, req_num;
std::cout << "Project 3 milestone: LRU" << std::endl;
std::cout << "Enter filename: " << std::endl;
std::cin >> fileName;


inFile.open(fileName.c_str(), std::ifstream::in);
if (!inFile)    {
    std::cerr << "Cannot open file!  " << fileName << std::endl;
}

while(inFile.is_open()) {
    inFile >> start_block >> num_blocks >> ignore >> req_num;
    n = new node;
    n->data = start_block;
    n->prev = NULL; // 1st node
    head = n;
    tail = n;
    size++;

    while(!inFile.eof())    {
        inFile >> start_block >> num_blocks >> ignore >> req_num;
        n = new node;
        n->data = start_block;
        n->prev = tail;
        tail->next = n;
        tail = n;
        size++;
        //std::cout << start_block << " " << num_blocks << " " << ignore << " " << req_num << std::endl;    
        if  (size == capacity)  {
            cout << "Reached capacity:" << capacity << endl;
            // this is where I would delete the head node
        }   
    }           
    inFile.close();
}

PrintForward(head);
//PrintReverse(tail);
SearchRecursive(head,18);
DeleteHead(head, tail);
PrintForward(head);
//DeleteHead(head, tail);
//PrintForward(head);
return 0;
}

void SearchRecursive(node* ptr, int searchValue)    {
if(ptr == NULL) {   // if we pssed through list and didnt find value
    cout << searchValue << " was NOT found in the list\n";
}       
else if (ptr->data == searchValue)  {   // if we DID find it
    cout << searchValue << " IS in the list!\n";
}
else    {
    SearchRecursive(ptr->next, searchValue);    // else search recursively
}
}

void DeleteHead(node* head, node* tail) {
if (head == tail)   {   // if only 1 element
    cout << "Only 1 element here" << endl;
    delete head;
    head = NULL;
    tail = NULL;
}
else    {
    cout << "More than 1 element here" << endl;
    node *temp = head;
    head = head->next;
    delete temp;
}
}

编辑:我改进了 SearchRecursive 函数,现在可以删除除头部和尾部之外的节点。这是我正在使用的:

void SearchRecursive(node* ptr, int searchValue)    {
if(ptr == NULL) {   // if we pssed through list and didnt find value
    cout << searchValue << " was NOT found in the list\n";
}       
else if (ptr->data == searchValue)  {   // if we DID find it
    cout << searchValue << " IS in the list!\n";
    ptr->prev->next = ptr->next;
    ptr->next->prev = ptr->prev;
    delete ptr;
}
else    {
    SearchRecursive(ptr->next, searchValue);    // else search recursively
}
}

【问题讨论】:

  • 你试过用调试器调试吗?

标签: c++ doubly-linked-list


【解决方案1】:

我最终做的是上述答案和评论的一些结合。 这是我现在的 DeleteHead 代码

void DeleteHead(node*& head, node* tail)    {
cout << "Deleting head..." << endl;
node* temp = head;
head = head->next;
size--;
delete temp;
}

【讨论】:

    【解决方案2】:

    因为你删除了头指针,在你调用DeleteHead之后头指针现在无效了,因为指针没有改变,函数中的变化只反映了指向head参数在里面的值函数并且它不会反映在这个函数之外,你想要的是改变传递的指针的值,这是通过引用完成的。 所以你的函数现在得到了对指针的引用,函数的签名现在是

    void DeleteHead(node** head, node* tail)
    

    在函数内部做*head = (*head)-&gt;next;

    或者你可以从函数中返回新的 head 值

    node* DeleteHead(node* head, node* tail)
    

    【讨论】:

    • 由于它是 C++ 而不是 C,您可能希望使用实际的 C++ 引用语义并使用 &amp; 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多