Один связанный список - Улучшения - 1 - неполная


ДЕЛАТЬ

  • обработка исключений
  • слиянием с динамическим arrary

*Так вот ошибку-удалите эту строку и управления не будет работать

/* 
Added in comments from Jerry, Ed and Loki 
This code borrows from from http://cslibrary.stanford.edu/    
C++ Version - lnode, lnode_reverse, lnode_push, lnode_print, lnode_count 
*/
#include "c_arclib.cpp"
template <class T1> class sl_list
  {
  private:
    class node_1 
      {
      public:     
        T1 data; 
        node_1 *next;
        node_1(T1 data, node_1 *next = NULL) : data(data), next(next) {}        
      };
    node_1 *head;
    int count;
  public:
    sl_list() : count(0), head(NULL){}
    void push(int data) 
      {
      node_1 *newNode = new node_1(data, head); 
      ++count; 
      head = newNode;
      }
    void print() 
      {
      node_1 *current=head;
      while (current != NULL) 
        {
        cout << current->data << endl;
        current = current->next;
        }
      }
    void reverse()
      {
      node_1 *previous, *current, *future;
      previous=NULL;
      current=head;
      future=head;
      while(current!=NULL)
        {
        future=current->next;
        current->next=previous;
        previous=current;
        current=future;
        }
      head=previous;
      }
    void break_heap()
      {
      int i=0;
      while(1)
        {
        i++;
        push(1);
        }
      }
    };
/*
C Version - lnode, lnode_reverse, lnode_push, lnode_print, lnode_count
*/

typedef struct node_type 
  { 
  int data; 
  struct node_type* next; 
  } lnode_type;

struct lnode 
  {
  int data;
  struct lnode* next;
  };
void lnode_reverse(struct lnode*& head)
  {
  struct lnode *previous, *current, *future;
  previous=NULL;
  current=head;
  future=head;
  while(current!=NULL)
    {
    future=current->next;
    current->next=previous;
    previous=current;
    current=future;
    }
  head=previous;
  }
void lnode_push(struct lnode*& head, int data) 
  {
  struct lnode* newNode = new lnode; 
  newNode->data = data;
  newNode->next = head;
  head = newNode; 
  }
void lnode_print(struct lnode* current) 
  {  
  while (current != NULL) 
    {
    cout << current->data;
    current = current->next;
    }
  }
int lnode_count(struct lnode* current) 
  {
  int count = 0;
  while (current != NULL) 
    {
    count++;
    current = current->next;
    }
  return count;
  } 
void break_heap()
  {
  struct lnode* head = NULL;
  int i=0;
  while(1)
    {
    i++;
    lnode_push(head,1);
    }
  }
int main()
  {
  sl_list<int> list1;
  list1.push(10);
  list1.push(20);
  list1.push(30);
  list1.push(40);
  list1.push(50);
  list1.push(60);

  list1.print();
  list1.reverse();
  list1.print();
  }


290
4
c++ c
задан 1 ноября 2011 в 03:11 Источник Поделиться
Комментарии
1 ответ

/* C++ Version - lnode, lnode_reverse, lnode_push, lnode_print, lnode_count
I need node_type turned into a templated class..How does one do this?
*/
typedef struct node_type
{
int data;
struct node_type* next;
} lnode_type;

Превращая его в шаблон достаточно прост:

template <class T>
class node_type {
T data;
node_type *next;
};

Обратите внимание, что оператор typedef не необходимо (Или желательно) в C++. Вы обычно хотите использовать класс, что, а затем тело определения класса. Это делает все, что может использоваться как имя само по себе, просто как определение типа В С.

Есть еще одна вещь, мы, вероятно, хотите сделать, хотя вся основная идея связанного списка узлов-это просто деталь реализации связанного списка, так что мы действительно хотим, чтобы узел тип вложенного класса внутри связанного списка класса:

template <class T>
class sl_list {

struct node {
T data;
node *next;
} head;

public:
// Other stuff here.
};

Оттуда, мы хотим написать функции, которые работают с данными типа Т вместо инт. Например, вместо толкания(инт), вы можете написать нечто подобное:

void push(T data) {
++count; // prefer pre-increment when you don't need the old value.
node* newNode = new node;
newNode->data = data;
newNode->next = head;
head = newNode;
}

Мы могли бы предпочесть, чтобы добавить конструктор к узлу класс/структуру, что-то вроде этого:

node(T data, node *next = NULL) : data(data), next(next) {}

При том, что пуш будет что-то вроде этого:

void push(T data) { 
node *newNode = new node(data, head);
++count;
head = newNode;
}

[Edit2: обратите внимание, что, как рекомендовал @LokiAstari, я также перенес ++рассчитывать , чтобы после выделения нового узла. Таким образом, если попытки выделения не удается (и новые выбрасывает исключение), считать будут не увеличивается, поэтому он сохраняет правильные значения. Если и только если выделение успешно, она увеличивается, чтобы отразить новый узел был добавлен в список. ]

[Правка: и узел будет выглядеть примерно так:

    struct node {
T data;
node *next;

node(T data, node *next = NULL) : data(data), next(next) {}
} head;

]

6
ответ дан 1 ноября 2011 в 03:11 Источник Поделиться