当前位置: 首页 > 知识库问答 >
问题:

双链表删除最后一个C

有品
2023-03-14

我正在做一个双链表的实现。我希望链表有一定的长度限制。当列表变长时,删除最后一个节点。我这里有些问题。我想定义尾巴,这样我就不必寻找终点。下面是我正在研究的实现,它将允许长度为4,然后开始删除最后一个节点。

/* Doubly Linked List implementation */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Node  {
    char command[1024];
    struct Node* next;
    struct Node* prev;
};

struct Node* head; //global pointing to head
struct Node* tail; //global pointing to tail

//Creates a new Node and returns pointer to it. 
struct Node* GetNewNode(char *line) {
    struct Node* newCommand = (struct Node*)malloc(sizeof(struct Node));
        int i = 0;
        while(line[i] != '\0'){
            newCommand->command[i] = line[i];
            i++;
        }
        newCommand->prev = NULL;
    newCommand->next = NULL;
    return newCommand;
}

//Inserts a Node at head of doubly linked list
void InsertAtHead(char *line) {
    struct Node* newCommand = GetNewNode(line);
    if(head == NULL) {
        head = newCommand;
        tail = newCommand;
        return;
    }
    head->prev = newCommand;
    newCommand->next = head; 
    head = newCommand;
}
//Use tail to delete the last node
void deleteLast(){
    struct Node* temp = tail;
    tail = temp->prev;
    free(tail->next);
    tail->next = NULL;
}
//Print in reverse orer
void Print() {
    struct Node* temp = tail;
    while(temp != NULL) {
        printf("%s \n",temp->command);
        temp = temp->prev;
    }
}

int main() {

        int numNodes = 0;
        char line[1024];
        head = NULL; 
        tail = NULL; // empty list. set head/tail as NULL. 
        printf("next node: ");
        while (fgets(line, 1024, stdin)) {
            line[strlen(line)-1] = '\0';
            if(numNodes == 4){
                numNodes -= 1;
                deleteLast();
            }
            InsertAtHead(line);Print();
            numNodes += 1;
            printf("next node: ");
        }
        Print();
}

它似乎在删除最后一个节点,但之后会打印一些奇怪的符号。我猜这是我如何释放的问题,但我想不出来。注意:此代码中的一些代码取自https://gist.github.com/mycodeschool/7429492

共有1个答案

蓬琦
2023-03-14

你的代码看起来不错,然而,有一个错误,在复制命令到节点:

    while(line[i] != '\0'){
        newCommand->command[i] = line[i];
        i++;
    }

应该是:

    while(line[i] != '\0'){
        newCommand->command[i] = line[i];
        i++;
    }
    newCommand->command[i] = '\0';

(您忘记终止复制的命令。)

还请注意,您必须检查不要超出可用空间,例如:

    while(i<1023 && line[i] != '\0'){
        newCommand->command[i] = line[i];
        i++;
    }
    newCommand->command[i] = '\0';
 类似资料:
  • 我有一个头和lastNode的参考。嗨我有个问题。当我删除双向链表中的最后一个节点时,我必须将该节点的前一个引用设置为空,或者我可以离开它。我在删除lastNode时做了这样的事情。 当我使用toString方法时,它会按预期打印。只是想知道是否有必要将旧的last node prev设置为null。或者垃圾收集器只是删除它,因为没有对它的引用,即使旧节点仍然有对链接列表中某个节点的引用

  • 每次我运行我的双链接列表时,除了从列表后面删除外,所有方法都有效。我有一张4,3,9的单子。我从前面拆下(这拿走了4个)。然后,我调用了这个方法,它应该只删除9。相反,当我调用DL列表时,它返回null(这也删除了3)。请帮忙。 下面是代码的其余部分(它扩展了一个接口;生成的代码对于这个问题不是必需的,所以我们没有填写它。也就是说,节点后面的内容无关紧要)正确的代码:

  • 问题内容: 我正在练习使用链表节点,遇到了一个我不知道如何回答的问题。如何删除链接列表中的最后一个节点。下面的代码适用于所有条目的最后一个节点。最后一个不会被删除。 节点类别 主要 问题答案: 我想您的最后一个元素失败了。最后一个元素将没有元素。因此,不会将最后一个元素与传递的字符串进行比较。您应该使用调试器进行跟踪。

  • 我正在尝试从单链接列表中删除最后一个节点。但我仍然无法在代码中解决此错误。我的方法没有删除最后一个节点。调用delete方法后,它仍然显示我要删除的节点。列表的其余部分将被删除,但最后一个节点本身不会被删除。你能告诉我我遗漏了什么,或者错误在哪里吗? LinkedList: 列表: 节点:

  • 公共类LinkedList11{//私有内部类节点 }

  • 有人能帮我为这个双链接列表写一个RemoveFirstOccurse方法吗? 它删除目标数据第一次出现的节点。搜索从头部开始。如果目标数据不在列表中,那么列表保持不变。最后一个节点的下一个字段值为null。没有尾部引用。 到目前为止,我写了这样的东西,但是当删除列表中没有的字符串时,我得到了一个空指针异常。我已经标记了NPE发生的地方。如果你能帮助找出原因,或者如果你有一个完全不同的方法来工作,那