2016-12-28 6 views
0

) Я работаю над кодом ... почти закончен, но я застрял в одной последней вещи, Мне нужно найти способ редактировать информацию клиента, когда пользователь желает. это мой код ... любой может сказать мне, что случилось, пожалуйста? :Редактирование узла в двоичной древовидной структуре

 #include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 
ifstream infile; 
ofstream outfile; 
struct INFO { 
    int id; 
    string name; 
    unsigned balance; 
    long phone; 
}; 
class Node 
{ 
public: 
    INFO data; 
    Node *left; 
    Node *right; 
    Node() { 
     data.id = 0; 
     data.name = "NULL"; 
     data.phone = 0; 
     data.balance = 0; 
    } 
    Node(INFO a) 
    { 
     data = a; 
     left = 0; 
     right = 0; 
    } 
}; 
class Tree 
{ 

public: 
    Node *root; 
    INFO inf; 
    Node *zero; 
    Tree() 
    { 
     root = 0; 
    } 
    bool insert(INFO inf) 
    { 
     if (root == 0) 
     { 
      root = new Node(inf); 
      return true; 
     } 
     Node *p = root; 
     Node *q = root; 

     while (p != 0) 
     { 
      q = p; 
      if (p->data.id == inf.id) 
       return false; 
      if (p->data.id > inf.id) 
       p = p->left; 
      else 
       p = p->right; 
     } 
     if (inf.id < q->data.id) 
      q->left = new Node(inf); 
     else 
      q->right = new Node(inf); 
     return true; 
    } 
    bool searchid(Node *p, int y) 
    { 
     if (p != 0) { 
      if (p->data.id == y) { 
       cout << "ID: "; 
       cout << p->data.id << "\t"; 
       cout << "Name: "; 
       cout << p->data.name << "\t"; 
       cout << "Balance: "; 
       cout << p->data.balance << "\t"; 
       cout << "Phone number: "; 
       cout << p->data.phone << endl; 
       cout << "_________________" << endl; 
       return true; 
      } 
     } 
     if (p->left != 0) { 
      if (searchid(p->left, y)) { 
       return true; 
      } 
     } 
     if (p->right != 0) { 
      if (searchid(p->right, y)) { 
       return true; 
      } 
     } 

     return false; 
    } 
    Node SAD(int id) { 
     Node *p = root; 
     if (p->data.id == id) { 
      Node *q = p; 
      return *p; 
     } 
     if (p->left != 0) 
      SAD(p->left->data.id); 
     if (p->right != 0) 
      SAD(p->right->data.id); 
     return *zero; 
    } 
    void edit(int q) { 
     Node p = SAD(q); 
     cout << "The ID is: " << p.data.id << endl; 
     cout << "The account owner: "; 
     cout << p.data.name << endl; 
     cout << "Do you want to edit the owner?(Y/N) "; 
     char x; 
     cin >> x; 
     if (x == 'Y' || x == 'y') { 
      string New; 
      cout << "Enter the new owner name: "; 
      cin >> New; 
      p.data.name = New; 
     } 
     cout << "The Balance in the account is: "; 
     cout << p.data.balance << endl; 
     cout << "Do you want to edit the balance?(Y/N) "; 
     cin >> x; 
     if (x == 'Y' || x == 'y') { 
      int New; 
      cout << "Enter the new Balance: "; 
      cin >> New; 
      p.data.balance = New; 
     } 
     cout << "The phone number is: "; 
     cout << p.data.phone << endl; 
     cout << "Do you want to edit the phone number?(Y/N) "; 
     cin >> x; 
     if (x == 'Y' || x == 'y') { 
      long New; 
      cout << "Enter the new phone number"; 
      cin >> New; 
      p.data.phone = New; 
     } 
     cout << p.data.id << " " << p.data.name << " " << p.data.balance << " " << p.data.phone << endl; 
     insert(p.data); 
    } 
    void print(Node *p) 
    { 

     if (p != 0) { 
      cout << "ID: "; 
      cout << p->data.id << "\t"; 
      cout << "Name: "; 
      cout << p->data.name << "\t"; 
      cout << "Balance: "; 
      cout << p->data.balance << "\t"; 
      cout << "Phone number: "; 
      cout << p->data.phone << endl; 
      cout << "_______________________________________________________________" << endl<<endl; 
     } 
     if (p->left != 0) 
      print(p->left); 
     if (p->right != 0) 
      print(p->right); 
    } 
    void store(Node *p) 
    { 
     if (p != 0) { 
      outfile << "ID: "; 
      outfile << p->data.id << " "; 
      outfile << "Name: "; 
      outfile << p->data.name << " "; 
      outfile << "Balance: "; 
      outfile << p->data.balance << " "; 
      outfile << "Phone number: "; 
      outfile << p->data.phone << endl; 
      outfile << "_______________________________________________________________" << endl; 
     } 
     if (p->left != 0) 
      store(p->left); 
     if (p->right != 0) 
      store(p->right); 
    } 
    bool searchname(Node *p, string x) 
    { 
     Node *q = root; 
     q = p; 
     while (p != 0) { 
      if (p->data.name == x) { 
       cout << "ID: " << p->data.id << "\t"; 
       cout << "Name: " << p->data.name << "\t"; 
       cout << "Balance: " << p->data.balance << "\t"; 
       cout << "Phone number: " << p->data.phone << endl; 
      } 
      else { 

      } 
     } 
    } 
}; 
void main() 
{ 
    outfile.open("clients.txt"); 
    int opt; 
    Tree t; 
    int m = 1; 
    while (m != 0) { 
     cout << "Choose an option:" << endl << "1- To Add new clients." << endl << "2- To Display the clients." << endl << "3- To Store the clients in a Text Document." << endl << "4- To Search for a specific client through it's ID." << endl << "5- To Edit a specific client's information" << endl << "6- To Delete a specific client." <<endl<<"7- Exit."<< endl; 
     cin >> opt; 
     switch (opt) { 

     case 1: 
      int n; 
      cout << "Enter the amount of clients: "; 
      cin >> n; 
      INFO *arr; 
      arr = new INFO[n]; 
      cout << "Enter the elements of the array: " << endl; 
      for (int i = 0; i < n; i++) 
      { 
       cout << "Client #" << i + 1 << endl << "-----------" << endl; 
       cout << "Enter the ID: "; 
       cin >> arr[i].id; 
       cout << "Enter the name of the client: "; 
       cin >> arr[i].name; 
       cout << "Enter the balance: "; 
       cin >> arr[i].balance; 
       cout << "Enter the phone number: "; 
       cin >> arr[i].phone; 
       t.insert(arr[i]); 
      } 
      break; 
     case 2: 
      t.print(t.root); 
      break; 
     case 3: 
      t.store(t.root); 
      cout << "Saved!" << endl << "in directory: C:/Users/Taiseer/Documents/Visual Studio 2015/Projects/ADS Project/ADS Project" << endl; 
      break; 
     case 4: 
      cout << endl; 
      int s; 
      cout << "What element do you want to search for? "; 
      cin >> s; 
      if (t.searchid(t.root, s) == false) { 
       cout << " Not here.... :(\n"; 
      } 

      cout << endl; 
      break; 
     case 5: 
      char x; 
      cin >> x; 
      if (x == 'y' || x == 'Y') { 
       int id; 
       cout << "Enter the id you want to edit: "; 
       cin >> id; 
       t.edit(id); 
      } 
      else 
       return; 
      break; 
     case 6: 
      break; 
     case 7: 
      m = 0; 
      break; 
     default: 
      cout << "lol" << endl; 
     } 
    } 
} 
+3

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Вы правы ... если бы я знал, что Algorithem решит мою проблему ... –

ответ

1

Проблема заключается в том, что дерево :: SAD() возвращает узел, который разыскивается по значению. Это означает, что в дереве :: редактировать(), следующая строка:

Node p = SAD(q); 

Получает копию фактического узла. Все, что изменилось в p, не изменилось в фактическом Дереве. В конце edit() вы пытаетесь выполнить insert(p.data), но это ничего не делает, потому что ваша реализация insert() никогда не перезаписывает уже существующие узлы.

Одним из решений является то, что SAD() возвращает указатель на найденный узел. Это дает дополнительное преимущество, которое вы можете вернуть nullptr, чтобы указать случай, когда поиск id не существует. Затем это можно использовать в edit(), чтобы напрямую изменить поля структуры Node.

+0

Теперь мой код позволяет мне редактировать первого клиента ... Но всякий раз, когда я пытаюсь редактировать другого клиента, кроме первого. . он падает :( –