2014-09-01 156 views
-1

我正在尝试创建一个节点对象。但我正在分段错误。我不是我做错了什么。这是我的代码 -尝试创建对象时出现分段错误

#include <bits/stdc++.h> 
#define MAX 1000 
#define THRESHOLD 2 
using namespace std; 

class Node{ 
    int val, fr; 
    Node* link; 
    public: 
     Node(){ 
      this->link = NULL; 
     } 
     void set_val(int val){ 
      this->val = val; 
     } 
     void set_fr(int fr){ 
      this->fr = fr; 
     } 
     void set_link(Node* link){ 
      this->link = link; 
     } 
     Node* get_link(){ 
      return this->link; 
     } 
     void inc_fr(){ 
      this->fr++; 
     } 
     int get_val() const{ 
      return this->val; 
     } 
     int get_fr() const{ 
      return this->fr; 
     } 
}; 

void increment(list<Node> &nodes, int &value); 
bool compare(const Node& first, const Node& second); 
void print_list(list<int> a); 
void print_node(Node a); 
void prune(list<Node> &nodes, list<int> &values); 
void sort_list(list<Node> &nodes, list<int> &values); 
int get_fr(list<Node> nodes, int val); 
void insert_into_tree(map< Node*,list<Node*> > &tree, map< int, Node* > &header, Node* head, list<int> values); 
bool find_head(map< Node*,list<Node*> > tree, Node* head); 

int main(){ 
    fstream file("my.txt"); 
    string s; 
    int check[MAX] = {0}; 
    list<Node> nodes; 
    map< Node*, list<Node*> > tree; 
    map< int, Node* > header; 
    Node* null = new Node(); 
    null->set_fr(0); 
    null->set_val(-1); 

    while(getline(file, s)){ 
     istringstream buf(s); 
     string s1; 
     while(getline(buf, s1, ' ')){ 
      istringstream buf1(s1); 
      int value; 
      buf1 >> value; 
      if(!check[value]){ 
       Node* new_node = new Node(); 
       new_node->set_val(value); 
       new_node->set_fr(1); 
       nodes.push_back(*new_node); 
       check[value] = 1; 
      } else { 
       increment(nodes, value); 
      } 
     } 
    } 

    for(list<Node>::iterator it=nodes.begin(); it!=nodes.end(); it++){ 
     if(it->get_fr() < THRESHOLD){ 
      nodes.erase(it); 
      it--; 
     } 
    } 
    file.clear(); 
    file.seekg(ios::beg); 

    while(getline(file, s)){ 
     cout << "Please Wait..." << endl; 
     istringstream buf(s); 
     string s1; 
     list<int> values; 
     while(getline(buf, s1, ' ')){ 
      istringstream buf1(s1); 
      int value; 
      buf1 >> value; 
      values.push_back(value); 
     } 
     prune(nodes, values); 
     sort_list(nodes, values); 
     print_list(values); 
     insert_into_tree(tree, header, null, values); 
    } 
    cout << "printing head" << endl; 
    for(map< Node*, list<Node*> >::iterator it=tree.begin(); it!=tree.end(); it++){ 
     print_node(*it->first); 
     cout << "children : "; 
     for(list<Node*>::iterator jt=it->second.begin(); jt!=it->second.end(); jt++){ 
      Node* x = *jt; 
      cout << x->get_val() << ' '; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

bool compare(const Node& first, const Node& second){ 
    if(first.get_fr() > second.get_fr()){ 
     return true; 
    } else{ 
     return false; 
    } 
} 

void increment(list<Node> &nodes, int &value){ 
    for(list<Node>::iterator it = nodes.begin(); it!=nodes.end(); it++){ 
     if(it->get_val() == value){ 
      it->inc_fr(); 
      break; 
     } 
    } 
} 

void print_list(list<int> a){ 
    cout << "item set "; 
    for(list<int>::iterator it = a.begin(); it!=a.end(); it++){ 
     cout << *it << " "; 
    } 
    cout << endl; 
} 
void print_node(Node a){ 
    cout << "item " << a.get_val() << endl; 
    cout << "frequency " << a.get_fr() << endl; 
} 

void prune(list<Node> &nodes, list<int> &values){ 
    for(list<int>::iterator it=values.begin(); it!=values.end(); it++){ 
     if(get_fr(nodes, *it) < THRESHOLD){ 
      values.erase(it); 
      it--; 
     } 
    } 
} 

void sort_list(list<Node> &nodes, list<int> &values){ 
    for(list<int>::iterator it=values.begin(); it!=values.end(); it++){ 
     for(list<int>::iterator jt=values.begin(); jt!=values.end(); jt++){ 
      if(get_fr(nodes, *it) > get_fr(nodes, *jt)){ 
       swap(*it, *jt); 
      } else if(get_fr(nodes, *it) == get_fr(nodes, *jt)){ 
       if(*it>*jt){ 
        swap(*it, *jt); 
       } 
      } 
     } 
    } 
} 

int get_fr (list<Node> nodes, int val){ 
    int fr; 
    bool found = false; 
    for(list<Node>::iterator it=nodes.begin(); it!=nodes.end(); it++){ 
     if(it->get_val() == val){ 
      found = true; 
      fr = it->get_fr(); 
      break; 
     } 
    } 
    if(found){ 
     return fr; 
    } else { 
     return -1; 
    } 
} 

void insert_into_tree(map< Node*,list<Node*> > &tree, map< int, Node* > &header, Node* head, list<int> values){ 
    if(header.find(head->get_val()) == header.end()){ 
     header[head->get_val()] = head; 
    } else{ 
     Node* new_head = header[head->get_val()]; 
     new_head = new Node(); 
     while(new_head != NULL){ 
      new_head = new_head->get_link(); 
     } 
     new_head->set_link(head); 
    } 
    if(values.empty()) return; 
    Node* node; 
    if(find_head(tree, head)){ 
     bool found = false; 
     for(list<Node*>::iterator it=tree[head].begin(); it!=tree[head].end(); it++){ 
      node = *it; 
      if(node->get_val() == values.front()){ 
       node->inc_fr(); 
       found = true; 
       break; 
      } 
     } 
     if(!found){ 
      node = new Node(); 
      node->set_val(values.front()); 
      node->set_fr(1); 
      tree[head].push_back(node); 
     } 
    } else{ 
     node = new Node(); 
     node->set_val(values.front()); 
     node->set_fr(1); 
     tree[head].push_back(node); 
    } 
    values.pop_front(); 
    insert_into_tree(tree, header, node, values); 
} 

bool find_head(map< Node*,list<Node*> > tree, Node* head){ 
    bool found = false; 
    for(map< Node*,list<Node*> >::iterator it=tree.begin(); it!=tree.end(); it++){ 
     Node* node = &*it->first; 
     if(node->get_val() == head->get_val()){ 
      found = true; 
      break; 
     } 
    } 
    return found; 
} 

我在set_link函数中收到错误。

+2

显示创建节点对象的实际代码。 – 2014-09-01 14:22:57

+1

你看到'this-> link = new Node();''''this'> link'在 – 2014-09-01 14:26:33

+0

之后被覆盖了好了,我已经删除了这行 - this-> link = new Node(); – 2014-09-01 14:29:31

回答

3

在这个函数:

void set_link(Node* link){ 
    this->link = new Node(); 
    this->link = link; 
} 

分配this->link两次,第一次与新创建的指针Node,而第二次与link参数,那么会发生什么:

  1. 指针用new创建丢失,导致内存泄漏。
  2. 也许在代码的其他地方,您调用delete node作为您之前作为参数传递给set_link函数的节点,因此this->link变得无效,并且当您尝试通过它访问数据时,会发生段错误。

同样对于段错误的原因可能是this是在set_link调用时无效(例如先前或空删除)。

编辑:实际上,它在您的代码中为空。

+0

我已经删除了这一行this-> link = new Node();仍然给我同样的错误。 – 2014-09-01 14:30:37

+0

@ eddard.stark这意味着你在某处删除了指针,就像我在第2页中所设想的那样 – 2014-09-01 14:31:07

+0

我在这一行中得到了seg错误错误this-> link = link; – 2014-09-01 14:31:27

相关问题