在双向链表中的节点模板中插入两个元素

时间:2014-09-22 22:45:35

标签: c++

我是C ++中数据结构的新手,我试图用模板做一个双向链表。我看到的所有示例仅适用于模板节点的1个元素,因此我试图在列表中的模板节点中放置2个元素,但我不知道该怎么做,无论如何,我试图列出清单。

以下是代码:

#include<iostream>
#include<cstring>

using namespace std;

template<class T>

// node class
class node
{
public:
     node();
     node(T);
     ~node();

    node *next;
    T data[2];

    void borra_todo();
    void print();
};

// by defect
template<typename T>
node<T>::node()
{
    data[0] = NULL;
    data[1] = NULL;
    next = NULL;
}

// by parameter
template<typename T>
node<T>::node(T data_)
{
    data[0] = data_[0];
    data[1] = data_[1];
    next = NULL;
}

// delete nodes
template<typename T>
void node<T>::borra_todo()
{
  if (next) 
  next->borra_todo();

  delete this;
}

// node printing
template<typename T>
void node<T>::print()
{
    cout << data[0] << " " << data[1] <<  "->";
}

template<typename T>
node<T>::~node() {}

// list

template <class T>
class list
{
 private:
        node<T> *m_head;
        int m_num_nodes;

 public:
        list();
        ~list();

        void add_head(T);
        void add_end(T);
        void add_sort(T);
        void fill(char r[30],  char n[30]);
        void search(T);
        void del_by_data(T);
        void print();
};

template<typename T>
list<T>::list()
{
   m_num_nodes = 0;
   m_head = NULL;
}

//add in the beginning
template<typename T>
void list<T>::add_head(T data_)
{
   node<T> *new_node = new node<T>(data_);
   node<T> *temp = m_head;

   if (!m_head)
   {
       m_head = new_node;
   }
   else
   {
       new_node->next = m_head;
       m_head = new_node;

       while (temp)
       {
              temp = temp->next;
       }
   }
   m_num_nodes++;
}

// add to the last
template<typename T>
void list<T>::add_end(T data_)
{
   node<T> *new_node = new node<T> (data_);
   node<T> *temp = m_head;

   if (!m_head)
   { 
       m_head = new_node;
   }
   else
   {
        while (temp->next != NULL)
        {
              temp = temp->next;
        }
        temp->next = new_node;
   }
   m_num_nodes++;
}

// it is supposed that sorts items in the list ...
template<typename T>
void list<T>::add_sort(T data_)
{
   node<T> *new_node = new node<T> (data_);
   node<T> *temp = m_head;

   if (!m_head)
   {
       m_head = new_node;
   }
   else
   {
       for (int i =0; i <= 1; i++)
       {

           if (m_head->data[0] > data_[i])
           {
                 new_node->next = m_head;
                 m_head = new_node;
           } 
           else
           {
                while ((temp->next != NULL) && (temp->next->data[0] < data_[i]))
                {
                      temp = temp->next;
                }
                new_node->next = temp->next;
                temp->next = new_node;
           }
       }
   m_num_nodes++;
   }
}

// sort adding ...
template<typename T>
void list<T>::fill(char rfc[30])
{
  char temprfc[30];
  char tempnombre[30];

  temprfc = "DUDE010101R0";
  tempnombre = "Dude";

  add_sort(temprfc, tempnombre);
  temprfc = "AUDE010101R1";
  tempnombre = "Commander";
  add_sort(temprfc, tempnombre);
}

// print list
template<typename T>
void list<T>::print()
{
   node<T> *temp = m_head;
   if (!m_head)
   {
       cout << "List is empty" << endl;
   }
   else
   {
       while (temp)
       {
             temp->print();
             if (!temp->next)
                 cout << "NULL\n";

             temp = temp->next;
       }
   }
   cout << endl;
}

// search the list
template<typename T>
void list<T>::search(T data_)
{
  node<T> *temp=m_head;
  int cont=1;
  int cont2=0;

  while(temp)
  {
      if(strcmp(temp->data,data_[0]))
      {
            cout<<"Element found " << temp->data;
            cout << " in position: " << cont << endl;
            cont2++;
      }
      temp=temp->next;
      cont++;
  }
  if(cont2==0)
  {
      cout << "Element not found"<<endl;
  }
}

// ... delete by data
template<typename T>
void list<T>::del_by_data(T data_)
{
   node<T> *temp = m_head;
   node<T> *temp1 = m_head->next;

   int cont =0;
   if (m_head->data ==  data_)
   {
       m_head = temp->next;
   }
   else
   {
        while (temp1)
        {
            if (temp1->data ==  data_)
            {
                node<T> *aux_node = temp1;
                temp->next = temp1->next;
                delete aux_node;
                cont++;
                m_num_nodes--;
            }
            temp = temp->next;
            temp1 = temp1->next;
        }
   }
   if (cont == 0)
   {
       cout << "No data" << endl;
   }
}

// destroy the constructor
template<typename T>
list<T>::~list() {}

int main()
{
   list<char> list1;

   char element1[30];
   char element2[30];

   int dim, choice, pos;

   do{
          cout << "Select a choice.\n";
          cout << "1. Print list\n";
          cout << "2. Delete an element of the list\n";
          cout << "3. Search an element of the list\n";
          cout << "4. Exit\n";
          cin >> choice;

          switch(choice)
          {
                case 1:
                {
                    cout << "Printing list:\n";
                    list1.fill("1","2");
                    list1.print();
                    break;
                 }

                 case 2:
                 {
                    cout << "Element to delete: ";
                    cin >> element1;
                    list1.search(element1);
                    element1 = "";
                    break;
                 }

                case 3:
                {
                    cout << "Element to search: ";
                    cin >> element1;
                    list1.search(element1);
                    element1 = "";
                    break;
                }
          }
   }while(choice != 4);



  return 0;
}

代码没有编译,它标记了如下错误:

&#34;错误:'void list :: fill(char *)'的原型与类'list'中的任何一个都不匹配  void list :: fill(char rfc [30])       ^ t3b.cpp:79:8:错误:候选者是:void list :: fill(char *,char *)    void fill(char r [30],char n [30]);&#34;

有关如何修复它的任何想法?或者有关如何使用模板将2个元素放入节点的任何想法?

提前致谢。

1 个答案:

答案 0 :(得分:1)

老兄,你应该在发布之前尝试稍微隔离错误。这是500行代码,在我看之前,我不得不将它们全部复制并粘贴到编辑器中。

当你声明填充时,它有两个参数,当你定义它时,它有一个。另外,我会出于多种原因避免使用字符数组,而是使用std::string