【问题标题】:Formatting Linked List Output by Overloading <<通过重载格式化链表输出 <<
【发布时间】:2012-03-10 11:51:28
【问题描述】:

我正在尝试格式化一个链接列表,以便它在每行上打印 5 个节点。我不确定如何执行此操作,因为我是运算符重载的新手。这是我尝试过的事情,但我陷入了困境,似乎无法掌握这个概念

     ostream &operator<<(ostream &os, List &s){ 

     nodeType<Type>* current = s.head; 
     int i = 0; 

 while (current != NULL) //while more data to print 
 { 
 os << current->info << " "; 
 current = current->link; 

 ++i; 

 if (i % 5 == 0) { 
     cout << '\n'; 
     i = 0; 
 } 
 } 

os << '\n'; // print the ending newline 

       return os; 
     }

其余代码

list.cpp

List::List()
{
node *head = NULL;
node *precurrent = NULL;
node *current = NULL;
int *temp = 0;
insert = 0;
search = 0;
remove = 0;
}

List::~List()
{
while (head != 0)
    remove();
}

void List::insert(int insert)
{
if (head==null)    \\If there is no list already, create a new head.
{
    temp = new Node;
    temp->data = insert;
    head = temp;
}
else                \\otherwise, insert the new node after current
{
    temp = new Node;
    temp->data = insert;
    temp->next = current->next;
    current->next = temp;
}
}

void List::search(int search)
{
current=head;
while (head->next != 0)  //Cycle through the list, and if the number is found, say so
{
    if (current->data = search)
        cout<<"Number found."<<endl;
    else
        cout<<"Number not found."<<endl;
}
}

void List::remove(int remove)
{
if (head == null)
    cout <<"Error.  No List."<<endl;
else if (head->next == null)
{
    num = head->data;
    delete head;
    head=null;
    current=null;
}
else if (head == current)
{
    temp = head->next;
    num = head->data;
    delete head;
    head=temp;
    current=temp;
}
else
{
    temp = current->next;
    num = current->data;
    delete current;
    precurrent->next = temp;
    current = temp;
}
}

list.h

//CLASS PROVIDED:  list                                 
//
// CONSTRUCTOR for the list class:
//   list()
//     Description:     Constructor will initialize variables
//     Preconditions:   None
//     Postcondition:   int insert = ""
//                      int search = ""
//                      int remove = ""
//   ~list()
//     Description:     Destructor destroys variables
//     Preconditions:   None
//     Postcondition:   variable deleted
//
// MEMBER FUNCTIONS for the list class      
//
//   string insert(int)
//     Description: Inserts an integer into a linked list   
//     Precondition: none
//     Postcondition: function returns Success/Error message.
//
//   string search(int);
//     Description:     Searches for certain linked list member and returns int to set current variable
//     Precondition:    none
//     Postcondition:   function returns int
//
//    string remove(int);
//     Description:     removes linked list member
//     Precondition:    user sends int to be deleted
//     Postcondition:   function returned string sddress
//   
//   void display(void);
//     Description:     displays entire linked list
//     Precondition:    none
//     Postcondition:   function returns screen output
//
//    void quit(void);
//     Description:     closes program
//     Precondition:    none
//     Postcondition:   none
//


#ifndef EMPLOYEE_H
#define EMPLOYEE_H

#include <string>
#include <iostream>
#include <cstdlib>

using namespace std;

class list
{     
  public:
//CONSTRUCTOR/DESTRUCTOR---------------------
    list();
    ~list();                                     

//GETS---------------------------------------
    void insert(int);
    string search(int);
    string remove(int);
    void display(void);
    void quit(void);

  private:

        int insert;
        int search;
        int remove;  


};




#endif

【问题讨论】:

    标签: c++ formatting linked-list operator-overloading


    【解决方案1】:

    您需要将current 设置为s.head,而不仅仅是head,因为这个非成员运算符重载(顾名思义)不是成员,所以没有定义它。

    您也完全错误地推进了指针;你应该像这样在每次迭代中打印一个info

    编辑:如果您想每行打印 5 个,请执行以下操作:

    int i = 0;
    
    while (current != NULL) //while more data to print
    {
         os << current->info << " ";
         current = current->link;
    
         if (i % 5 == 0) {
             cout << '\n';
             i = 0;
         } else
             ++i;
    }
    
    os << '\n'; // print the ending newline
    

    还没有定义Type(除非它位于您尚未发布的代码中)。如果你的List 是一个模板,你也需要让你的操作符重载一个模板。

    请初始化变量而不是声明它们然后分配给它们。这个:

    nodeType<Type> *current; //pointer to traverse the list
    current = head; //set current so that it points to the first node
    

    应该是

    nodeType<Type>* current = s.head;
    

    【讨论】:

    • @dtturner12 这没有帮助,因为我不知道我的答案有什么问题。
    • 感谢您的回答。我现在对推进和印刷有了更好的理解。但是,我将如何将它打印到 5 个节点部分?我想打印这样的列表 1 2 3 4 5 "newline' 6 7 8 9 10
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多