错误LNK1169:找到一个或多个多重定义的符号

-2 c++ compiler-errors

我正在制作Avl树项目,但得到2个构建错误,即

error LNK1169: one or more multiply defined symbols found
error LNK2005: "struct avl_node * root" (?root@@3PAUavl_node@@A) already defined in AVL.obj 
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

#include "AVL.h"

int main()
{
  AVL obj;
  char pn[30],fn[30],add[20],di[15],dn[30];
  int id,age,nic;
  int ch;
  cout<<"Want To Build BST On Basis Of:"<<endl
    <<"1.NIC"<<endl
    <<"2.ID"<<endl;
  cout<<"Enter Your Choice:";
  cin>>ch;
  switch(ch)
  {
    case 1:
      do{
        cout<<"Patients Database"<<endl
          <<"1.Enter New Record"<<endl
          <<"2.Search Record"<<endl
          <<"3.Delete Record"<<endl
          <<"4.Show Record"<<endl
          <<"5.Exit"<<endl;
        cout<<"What Do You Want To Do:";
        cin>>ch;
        switch(ch)
        {
          case 1: cout<<"Enter Patient ID:";
                  cin>>id;
                  cin.clear();
                  cin.ignore();
                  cout<<"Enter Patient Name:";
                  gets(pn);
                  cout<<"Enter Father Name:";
                  gets(fn);
                  cout<<"Enter Patient's Age:";
                  cin>>age;
                  cout<<"Enter Patient NIC:";
                  cin>>nic;
                  cin.clear();
                  cin.ignore();
                  cout<<"Enter Address:";
                  gets(add);
                  cout<<"Enter Disease:";
                  gets(di);
                  cout<<"Enter Doctor Name:";
                  gets(dn);
                  root=obj.adddatanic(root,id,pn,fn,age,nic,add,di,dn);
                  break;

          case 2: obj.searchbynic();
                  break;

          case 3:
                  break;

          case 4: cout<<"Show Record:-"<<endl
                  <<"1.Show Greatest NIC"<<endl
                    <<"2.Show Least NIC"<<endl
                    <<"3.Show All Records In Ascending Order"<<endl
                    <<"4.Show All Records In Descending Order"<<endl;
                  cout<<"Enter Your Choice:";
                  cin>>ch;
                  switch(ch)
                  {
                    case 1: obj.showgreatestnic();
                            break;

                    case 2: obj.showleastnic();
                            break;

                    case 3: obj.showascendingnic();
                            break;

                    case 4: obj.showdescendingnic();
                            break;
                  }
                  break;

          case 5: exit(-1);

          default: cout<<"Wrong Entry"<<endl;
                   break;
        }
      }
      while(ch!=5);
      break;

    case 2:
      do{
        cout<<"Patients Database"<<endl
          <<"1.Enter New Record"<<endl
          <<"2.Search Record"<<endl
          <<"3.Delete Record"<<endl
          <<"4.Show Record"<<endl
          <<"5.Exit"<<endl;
        cout<<"What Do You Want To Do:";
        cin>>ch;
        switch(ch)
        {
          case 1: cout<<"Enter Patient ID:";
                  cin>>id;
                  cin.clear();
                  cin.ignore();
                  cout<<"Enter Patient Name:";
                  gets(pn);
                  cout<<"Enter Father Name:";
                  gets(fn);
                  cout<<"Enter Patient's Age:";
                  cin>>age;
                  cout<<"Enter Patient NIC:";
                  cin>>nic;
                  cin.clear();
                  cin.ignore();
                  cout<<"Enter Address:";
                  gets(add);
                  cout<<"Enter Disease:";
                  gets(di);
                  cout<<"Enter Doctor Name:";
                  gets(dn);
                  root=obj.adddataid(root,id,pn,fn,age,nic,add,di,dn);
                  break;

          case 2: obj.searchbyid();
                  break;

          case 3:
                  break;

          case 4: cout<<"Show Record:-"<<endl
                  <<"1.Show Greatest ID"<<endl
                    <<"2.Show Least ID"<<endl
                    <<"3.Show All Records In Ascending Order"<<endl
                    <<"4.Show All Records In Descending Order"<<endl;
                  cout<<"Enter Your Choice:";
                  cin>>ch;
                  switch(ch)
                  {
                    case 1: obj.showgreatestid();
                            break;

                    case 2: obj.showleastid();
                            break;

                    case 3: obj.showascendingid();
                            break;

                    case 4: obj.showdescendingid();
                            break;
                  }
                  break;

          case 5: exit(-1);

          default: cout<<"Wrong Entry"<<endl;
                   break;
        }
      }
      while(ch!=5);
      break;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的AVL.h文件.

#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
#include<cstdio>
#include<sstream>

#define pow2(n) (1 << (n)

using namespace std;

   struct avl_node
   {
avl_node* left;
avl_node* right;
char pname[30]; //Patient Name
char fname[30]; //Father Name
int age;
int nic;
char address[20];
char disease[15];
char dname[30]; //Doctor Name
int p_id; //Pateint Id
   }*root;

      class AVL
    {
     public:
AVL();
int height(avl_node*);
int diff(avl_node*);
avl_node* r_rotation(avl_node*); //Right Rotation
avl_node* l_rotation(avl_node*); //Left Rotation
avl_node* lr_rotation(avl_node*); //Left-Right Rotation
avl_node* rl_rotation(avl_node*); //Right-Left Rotation
avl_node* balance(avl_node*);
//Functions For NIC Key
avl_node* getdatanic(avl_node*,int,char[],char[],int,int,char[],char[],char[]);
avl_node* adddatanic(avl_node*,int,char[],char[],int,int,char[],char[],char[]);
void searchbynic();
void showgreatestnic();
void showleastnic();
void showascendingnic();
void ascendingnic(avl_node*);
void showdescendingnic();
void descendingnic(avl_node*);
//Functions For ID Key
avl_node* getdataid(avl_node*,int,char[],char[],int,int,char[],char[],char[]);
avl_node* adddataid(avl_node*,int,char[],char[],int,int,char[],char[],char[]);
void searchbyid();
void showgreatestid();
void showleastid();
void showascendingid();
void ascendingid(avl_node*);
void showdescendingid();
void descendingid(avl_node*);
void delete_all(avl_node*);
~AVL();
    };
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

最有可能的是,你已经rootAVL.h标题中定义了 - 而不是声明 - 并且你有多个文件包含AVL.h标题(如果只有一个文件包含它,那么有一个标题没什么意义),所以你有变量root乘法定义.

你写的机率很大:

avl_node *root;
Run Code Online (Sandbox Code Playgroud)

(可能包括一个初始化程序= 0)而不是正确的:

extern avl_node *root;
Run Code Online (Sandbox Code Playgroud)

在头文件中.修复是双重的:

  1. extern在标题中包含(并确保没有初始值设定项).
  2. avl_node *root;在适当的源文件中定义(可能AVL.cpp,或者您用于C++源代码的任何扩展名).

您的标题包含:

struct avl_node
{
    avl_node* left;
    avl_node* right;
    char pname[30]; //Patient Name
    char fname[30]; //Father Name
    int age;
    int nic;
    char address[20];
    char disease[15];
    char dname[30]; //Doctor Name
    int p_id; //Patient Id
} *root;
Run Code Online (Sandbox Code Playgroud)

它需要包含:

struct avl_node
{
    avl_node* left;
    avl_node* right;
    char pname[30]; //Patient Name
    char fname[30]; //Father Name
    int age;
    int nic;
    char address[20];
    char disease[15];
    char dname[30]; //Doctor Name
    int p_id; //Patient Id
};

extern avl_node *root;
Run Code Online (Sandbox Code Playgroud)

AVL.cpp中的代码需要额外的行:

avl_node *root = 0;
Run Code Online (Sandbox Code Playgroud)

一切都需要重新编译.

(我们将structvs 的设计选择留给class另一天.)