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

单链表的头一直到列表的最后一项[已关闭]

归明诚
2023-03-14

编辑问题以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

我试图在C上创建一个单链表。我用3个函数来创建一个基于“DiseaseList”结构的项目,将该项目添加到列表中,然后打印出来。

我已经花了几个小时梳理这些代码,我似乎无法阻止它将这个列表的开头定位到最后一项。只有两点可以改变头部(其中head=*),但这肯定是对我所写内容的误解,因为我无法理解。

例如,我添加了两个新元素“1”

#include <iostream>
using namespace std;

typedef struct DiseaseList
{
    int a;
    struct DiseaseList *Next;

}DList; //Not sure if I needed DList here or should have just used DiseaseList

DList* CreateElement();
void printList(DList*);
DList* AddElement(DList*, DList*);



int main(void)
{
int choose;
DList *Head = NULL, *NewElement;
do {

cout << "1. Add element" << endl;
cout << "2. Print list" << endl;
cout << "3. Exit" << endl;
cin >> choose;
switch (choose)
{
    case 1: 
        NewElement = CreateElement();
        Head = AddElement(Head, NewElement); 
        break;
    case 2: printList(Head); break;
    case 3: return 0;
}
} while (1);

}

DList* CreateElement() //Creates a new item for the list
{
    DList* temp;

    cout << "New Number:";
    cin >> temp->a;
    temp->Next = NULL;
    return temp;
}

DList* AddElement(DList *Head, DList *NewElement) //Adds new item from CreateElement to the list
{

if (Head == NULL)
{
    NewElement->Next = NULL;
    Head = NewElement;

}
else{

DList *temp = Head;
while (temp->Next != NULL)
{
    temp = temp->Next;
}
    temp->Next = NewElement;

}
return Head;
}

void printList(DList* Head)
{
    while (Head != NULL)
{
    cout << Head->a << endl;
    Head = Head->Next;
}

}

共有3个答案

邵弘致
2023-03-14

只需要小修复(也清理了空白):

#include <iostream>
using namespace std;

typedef struct DList_
{
    int a;
    struct DList_ *Next;
}DList;

DList* CreateElement();
void printList(DList*);
DList* AddElement(DList*, DList*);

int main(void)
{
int choose;
DList *Head = NULL, *NewElement;
    do {
        cout << "1. Add element" << endl;
        cout << "2. Print list" << endl;
        cout << "3. Exit" << endl;
        cin >> choose;
        switch (choose)
        {
        case 1: 
            NewElement = CreateElement();
            Head = AddElement(Head, NewElement); 
            break;
        case 2: printList(Head); break;
        case 3: return 0;
        }
    } while (1);
    return 0;
}

DList* CreateElement() //Creates a new item for the list
{
    DList* temp = new DList;
    cout << "New Number:";
    cin >> temp->a;
    temp->Next = NULL;
    return temp;
}

DList* AddElement(DList *Head, DList *NewElement) //Adds new item from CreateElement to the list
{
    if(Head == NULL)
        return NewElement;
    DList *temp = Head;
    while (temp->Next != NULL)
        temp = temp->Next;
    temp->Next = NewElement;
    return Head;
}

void printList(DList* Head)
{
    while (Head != NULL)
    {
        cout << Head->a << endl;
        Head = Head->Next;
    }
}
贺浩漫
2023-03-14

除了@TheDark的答案之外,您应该注意,除非您分配 AddElement() 的返回值,否则 Head 参数永远不会在 main() 中更改,因为您是按值传递指针:

DList* AddElement(DList *Head, DList *NewElement)  {

最好通过引用传递<code>Head</code>指针,使其正确初始化

void AddElement(DList*& Head, DList *NewElement)  {
                   // ^ Note the &
    // ...
}
越星晖
2023-03-14

CreateElement实际上并没有创建元素!

这意味着它返回(并使用)一个未初始化的指针,我很惊讶你的编译器没有显示警告。

替换此行:

DList* temp;

DList* temp = new Dlist;
 类似资料:
  • 在单链表中,我们知道最后一个节点的下一个指向,这样我们就可以通过遍历找到它。 如果单链表的最后一个节点指向某个中间节点,那么我们如何找到最后一个节点?

  • 我在课堂上创建了两个列表。 其中一个称为预算,包含元素section、month和sum,返回以下内容: [Budzet{sec='AGD/RTV',月='01',和=96},Budzet{sec='AGD/RTV',月='03',和=30},Budzet{sec='食品',月='04',和=23},Budzet{sec='游戏',月='09',和=1084}...] 这是SQL查询 第二个是元素

  • 我目前正在为Java中的循环链表工作。我们应该能够在列表的前面插入和后面插入。但是,我已经让这些方法在循环链表类中正常工作。 我得到的结果是 对于第二次插入,这里的next指向null应该指向列表的头部。 节点类 循环链表类 主班

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

  • 给定单链表的最后一个节点,我们如何找到头节点? 假设给定JSON: {“id”:“A”,“next”:“B”},{“id”:“B”,“next”:“C”}{“id”:“C”,“next”:“D”}{“id”:“D”,“next”:“null} 现在假设上面没有排序,我们需要算出HEAD元素“A”。

  • 我有一个奇怪的场景,每次我从的第一项中的微调器中选择一个值,最后一个项的微调器值与第一项相同。只有当ListView项目总数为5个及以上时,才会发生这种情况。我注释掉了代码,只保留了声明,但它仍在发生。这是Android系统的漏洞吗? 澄清: > 我的ListView的为空 我的微调器的被注释掉。 Android SDK工具版本为22.6.2 Android SDK平台工具是19.0.1 以下是适