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

C链表遍历

张星洲
2023-03-14

嘿,伙计们,我在让for循环工作时遇到了一些麻烦。myList是一个链表,其中填充了文件中的数字,我正在尝试遍历它并以一种(当前,下一个)的方式打印当前值和每个下一个值-

linkedList test = myList;

for (int i = 1; i <= count; i++)
{
    cout << "(" << test.listHead->value << "," << test.listHead->next->value << ")-->";
    test.listHead = test.listHead->next;
}           

出于某种原因,for循环无法执行任何操作,或者更确切地说,代码在for循环的开始就中断了。如果我摆脱for循环并只是复制和粘贴

    cout << "(" << test.listHead->value << "," << test.listHead->next->value << ")-->";
    test.listHead = test.listHead->next;

很多时候它会按照我的意愿工作,但我宁愿不这样做。for 循环语法看起来是正确的,如果 say count 是 17,那么在到达列表末尾之前,应该有 17 次迭代。

编辑:

包括类的源代码

class listNode{

public:
int value;
listNode* next;
friend class linkedList;


listNode():value(0),next(0) {
}
public:
~listNode(){
}; 

};


class linkedList{

public:
listNode* listHead;
listNode* spot;
int count;

linkedList()
{
    listHead->value = -9999;
}


bool isEmpty()
{
    return (listHead == NULL);  
}

void listInsert (int data)
{
    spot = findSpot(data);
    listNode* newNode = new listNode;
    newNode-> value = data;
    newNode-> next = spot->next;
    spot->next = newNode;

    cout << "inserted " << newNode->value << endl;  
}

listNode* findSpot (int data)
{
    spot = listHead;
    if (isEmpty())
    {
        return NULL;
    }

    while (spot->next != NULL && spot->next->value < data)
    {
   spot = spot->next;
     }

      if (spot->next->value == data)
        {
            cout << "The number: " << data << " already exists in the linked  list." << endl;
    spot = spot->next;

        }
    return spot;

}

由于我正在输出到文件(使用流输出文件)。如果我这样做

 outfile << "(" << test.listHead->value << "," << test.listHead->next->value << ")-->";
    test.listHead = test.listHead->next;

正好是17倍(这是链表和计数变量的大小),它为我生成了整个列表。但是每当我尝试初始化一个

 listNode* test = myList.ListHead;

然后它将拒绝运行。它编译得很好,但是运行结束了。

我在主要使用什么来填充链接列表

  ifstream infile;
  infile.open((argv[1]));
  while (infile >> data)
  {

    myList.listInsert(data);
  }

共有1个答案

匡晟
2023-03-14

您实际上在循环中修改了列表头指针。您需要对当前节点使用单独的变量,并将其初始化为列表头。在取消引用下一个指针之前,您还需要检查它是否有效。

喜欢

auto currentNode = myList.listHead;
for (int i = 1; i <= count && currentNode != nullptr; ++i, currentNode = currentNode->next)
{
    if (currentNode->next != nullptr)
    {
        cout << "(" << currentNode->value << "," << currentNode->next->value << ")-->";
    }
    else
    {
        cout << "(" << currentNode->value << ")-->";
    }
}

实际的问题是< code>linkedList类,它有一个主要问题,会导致几种未定义行为的情况:您没有初始化该类的成员变量。因为它们没有被初始化,所以它们的值将是不确定的,并且除了初始化它们之外,以任何方式使用它们都将导致所述UB。

您需要将<code>列表头

如果您需要在列表末尾保留一个虚拟节点(尽管我不知道为什么),那么您实际上需要分配一个节点。

 类似资料:
  • 每次我们在堆中为链表分配内存时,我们都会得到一个地址,这个地址链接到链表的下一个变量,head是指向链表初始节点的指针。 如果我们做,那么它会指向下一个链表,或者指向堆的随机内存,或者指向堆中初学者列表的下一个内存。

  • 如果水平顺序遍历优于rest遍历,那么在二叉搜索树中学习它们有什么用呢? 与顺序遍历和前序遍历相比,级别顺序遍历似乎更容易获取信息。

  • 我有一个通用的链表,其中保存的数据类型为空*我试图填充我的列表与结构雇员类型,最终我想破坏对象结构雇员以及。 考虑这个通用的链接列表头文件(我已经用char*类型测试过了): 考虑员工结构 现在考虑从main()调用的示例测试用例: 为什么我在下面发布的答案解决了我的问题?我相信这与指针和内存分配有关。我使用的函数Malloc()是一个自定义Malloc,用于检查是否返回NULL。 下面是我的整个

  • 问题内容: 如何以相反的顺序遍历链接哈希表?地图中是否有预定义的方法可以做到这一点? 我创建它如下: 问题答案: List > list = new ArrayList<>(map.entrySet()); 确实不是很漂亮,但是要花费一个条目集的副本,如果您的地图上有很多条目,则可能会出现问题。 出色的Guava库具有一个,可让您将Java 5用于每个样式循环而不是索引循环:

  • 本文向大家介绍单链表反转 遍历法Java实现相关面试题,主要包含被问及单链表反转 遍历法Java实现时的应答技巧和注意事项,需要的朋友参考一下