2016-12-28 15 views
0

) 私はコードを作成しています...ほとんど完了しましたが、最後の1つが残っています クライアントの情報を編集する方法を見つける必要があります願う。 これは私のコードです...いずれか間違って何かを教えてください? :ノードをバイナリツリー構造で編集する

 #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

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](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()の実装は、既存のノードを上書きしないためです。

解決策の1つは、見つけたノードへのポインタを返すことです。これには、idが検索された場合を示すためにnullptrを返すという利点があります。 Node構造体のフィールドを直接変更するには、edit()でこれを使用できます。

+0

私のコードでは最初のクライアントを編集できます... しかし、私が最初のもの以外の別のクライアントを編集しようとすると...それはクラッシュする:( –

関連する問題