【问题标题】:Adding to head of linked list添加到链表的头部
【发布时间】:2020-06-23 16:05:06
【问题描述】:
Student *addToHead(Student *node, int data) {
    Student *temp;
    temp = createNode(data);
    temp->nextPtr = node;
    return temp;
}

这段代码没有插入到链表的头部我不知道为什么。 我没有在链表的开头使用虚拟节点。

这是我的整个主要功能:

int main(void) {
    Student *test = initList();
    int searchTest = 0;

    test = addToHead(test, 3);
    test = addToHead(test, 2);
    test = addToHead(test, 1);
    test = addToTail(test, 4);
    test = addToTail(test, 5);

    printList(test);

    searchTest = searchAge(test, 4);
    printf("%d\n", searchTest);

    test = freeList(test);
}

这是正在输出的内容:

4
5
0
Free was successful

尾部插入正确,但头部未正确插入。

这是tail的代码

Student *addToTail(Student *node, int data) {
    Student *temp;
    temp = createNode(data);
    temp->age = data;

    if (node == NULL) {
        node = temp;
    } else {
        while (node->nextPtr != NULL) {
            node = node->nextPtr;
        }
        node->nextPtr = temp;
    }
    return node;
}

【问题讨论】:

  • 我的猜测是你忽略了函数返回的内容。
  • 您还没有展示如何使用该功能。该功能执行所需的操作;但是,您必须正确使用返回值。确保创建 MCVE (Minimal, Complete, Verifiable Example)(或 MRE 或 SO 现在使用的任何名称)或 SSCCE (Short, Self-Contained, Correct Example)。
  • @joycem8845 这可能是函数 addToTail 工作不正确的结果。显示它。
  • @VladfromMoscow 我现在添加了尾部代码。
  • @joycem8845 在您添加函数 addToTail 的定义之前,我已经写好了答案。:)

标签: c struct linked-list singly-linked-list


【解决方案1】:

问题不在于函数addToHead。问题是你没有显示的函数addToTail

例如可以这样看

Student *addToTail(Student *node, int data){
        Student *temp = createNode(data);

        if ( node == NULL )
        {
            temp->nextPtr = node;
            node = temp;
        }
        else
        {
            Student *tail = node;
            while ( tail->nextPtr != NULL ) tail = tail->nextPtr;
            // Uncomment the line below if createNode does not set the data member nextPtr to NULL
            // temp->nextPtr = NULL
            tail->nextPtr = temp;
        }

        return node;
}

编辑:在您将答案附加到函数 addToTail 的定义之后,很明显我说这个函数是错误的是正确的。

在函数中你正在改变头节点

    while(node->nextPtr!=NULL){
        node=node->nextPtr;
    }

您正在从函数返回。

【讨论】:

  • 是的,我的尾部函数是错误的。非常感谢。
  • @joycem8845 — 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请参阅About 页面以及How do I ask questions here?What do I do when someone answers my question?
【解决方案2】:

你如何调用这个函数?调用者应该这样做

head = addToHead(head, 3) 

例如。

【讨论】:

  • 有一个论点应该是评论。还有一个论点认为这可能是正确的答案——OP 没有正确捕获返回值,如图所示。
  • 是的,我就是这样称呼这个函数的。
  • @joycem8845 — 如果您调用如图所示的函数,那么您需要展示更多使用该函数的方式以及您如何知道新项目不在列表的头部.问题中的代码没有向我们展示这一点。它看起来确实应该可以工作。
  • 您好,@JonathanLeffler,这是我在 stackoverflow 中的第一个答案,因此我无法发表评论。
  • @JonathanLeffler 我编辑了问题以提供我的整个主要内容和输出内容
【解决方案3】:

你想要的更像

Student *addToHead(Student **head, int data) {
    Student *tmp = NULL;
    tmp = createNode(data);
    tmp->nextPtr = *head;
    *head = tmp;
    return tmp;
}

然后调用它

addToHead(&listHead, 42);

或者保留您的版本并使用以下命令调用它:

listHead = addToHead(listHead, 42);

【讨论】:

  • 说我不能通过引用传递头部
  • @joycem8845 无论如何编辑的代码在其他地方有错误,addToHead 应该可以工作
猜你喜欢
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 2021-06-28
  • 2020-06-23
  • 1970-01-01
相关资源
最近更新 更多