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

尾部->下一个打印地址,而不是数据循环链表c

酆鸿哲
2023-03-14

我试图把我的循环单链表的两端连在一起。在文件名文件中。txt,包含ABCDEFGHIJKLMNOPQRSTUVWXYZ作为文本,我能够分别打印出头部和尾部,A和Z。然而,我希望Z指向A,但是我的输出是A的地址(见下文)。我在addNode()中做错了什么?

#include <string.h>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>    // For file input
#include <cassert>    // for assertions
using namespace std;

    FILE *filename = fopen("file.txt", "r"); // Try to open file


struct Node
  {
  char data;
  Node* next;

  } ;

    void addNode( Node * &head, Node * &tail, char input)
      {
      Node *pTemp = new Node;
      pTemp->data = input;

       if( head == NULL)
          {
            head=pTemp;
           tail=pTemp;
               tail->next = head;
          }

      else
          {
          tail->next = pTemp;
                pTemp->next=head;
          }

    tail=pTemp;

      }//end addNode()


    int main()
      {
      assert(filename);
      Node *head=NULL;
       Node *tail=NULL;
      char c =' ';
      int i=0;

      while( fscanf(filename,"%c", &c) != EOF)
        addNode( head,tail, c);



    cout<<endl;
    cout<<"\nHead element is "<<head->data<<endl;
    cout<<"Tail element is "<<tail->data<<endl;
    cout<<"After tail '"<<tail->data<<"' is : "<< tail->next<<endl;

      }

电流输出为:

Head element is A
Tail element is Z
After tail 'Z' is : 0x371168

期望输出为:

Head element is A
Tail element is Z
After tail 'Z' is : A

共有2个答案

杜联
2023-03-14

tail-

cout<<"After tail '"<<tail->data<<"' is : "<< tail->next->data <<endl;

斜烈
2023-03-14
#include <string.h>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>    // For file input
#include <cassert>    // for assertions
using namespace std;

    FILE *filename = fopen("file.txt", "r"); // Try to open file


struct Node
  {
  char data;
  Node* next;

  } ;

    void addNode( Node * &head, Node * &tail, char input)
      {
      Node *pTemp = new Node;
      pTemp->data = input;

       if( head == NULL)
          {
            head=tail =pTemp;
           tail->next=pTemp;

          }

      else
          {
          pTemp->next = tail->next;
          tail->next=pTemp;
          tail = pTemp;

          }


      }//end addNode()


    int main()
      {
      assert(filename);
      Node *head=NULL;
       Node *tail=NULL;
      char c =' ';
      int i=0;

      while( fscanf(filename,"%c", &c) != EOF)
        addNode( head,tail, c);



    cout<<endl;
    cout<<"\nHead element is "<<head->data<<endl;
    cout<<"Tail element is "<<tail->data<<endl;
    cout<<"After tail '"<<tail->data<<"' is : "<< tail->next->data<<endl;

      }

试试这个。

我已经进一步改进和删除所需的代码从你的addNode。

你想设置“尾巴”的原因-

这样不仅可以遍历第一个和最后一个元素。您可以遍历整个链接列表。

如果您错过了此语句,那么您将无法遍历。上一个节点的下一个变量不会与下一个连接。

例子:

Node A
[A  | pointer to self] <- head and tail 
Node B
[A  | pointer to B ] <-head
[B  | pointer to A ] <-tail
Node C
[A  | pointer to B ] <-head
[B  | pointer to C ]  
[C  | pointer to A ]   <-tail

Node D
[A  | pointer to B ] <-head
[B  | pointer to C ]  
[C  | pointer to D ]    
[C  | pointer to A ]   <-tail
 类似资料:
  • 问题内容: 该代码似乎在运行,除了我得到的不是指定的(由用户)大小的矩阵,而是我认为的是堆地址这是当用户输入2作为大小然后输入4个数字时返回的内容: 输入矩阵大小:2逐行输入2 x 2矩阵:2 3 4 5行排序矩阵是… [[D @ 3c954549BUILD SUCCESSFUL(总时间:8秒) 这是代码…。谢谢您。 问题答案: Java数组不会覆盖,因此您将从中获取默认实现。相反,您可以使用li

  • 题目链接 牛客网 题目描述 从尾到头反过来打印出每个结点的值。 解题思路 1. 使用递归 要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。 // java public ArrayList printListFro

  • 我是Kotlin的新手,我正在使用for循环,在Kotlin脚本(*.kts文件)中,我在文件中有以下内容: 我确实认为它会像这样在一行中打印由逗号分隔的数字1到5: 但是我在命令行上没有任何输出。我在Mac上通过

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

  • 一、题目 输入个链表的头结点,从尾到头反过来打印出每个结点的值。 二、解题思路 使用栈的方式进行。 将链表从头到尾压入栈内,出栈的过程就对应着从尾到头。 三、解题代码 public class Test { /** * 结点对象 */ public static class ListNode { int val; // 结点的值

  • 我只想用下面的公式从任何给定的数字创建一个因子列表。我不允许使用列表,因此,我模仿使用字符串如下: 例如,假设我们选择num=12: