链接列表帮助c ++

时间:2015-04-11 22:51:19

标签: c++ templates linked-list

基本上我需要帮助的是初始化我的find_person和print_person方法以在main.Right中运行。现在当我运行程序时,除了主要的cout和cin之外没有任何事情发生。如果不是完全正确的话,这些方法非常接近(如果它们不是请让我知道)(fyi,州和人信息来自同一个文件,我只是获取人物对象的所有信息,只是状态字符串输出对于州对象。)任何帮助将不胜感激谢谢。

#include <iostream>
#include <string>
#include <string.h>
#include <fstream>
using namespace std;

struct person
{
    int dob,ss_number;
    string fname, lname,state;

    person()
    { }
    person(int a, int b, string c, string d, string e)
    {dob=a; ss_number=b; fname=c; lname=d; state=e;}
};


struct state
{
    string sname;


    state()
    {}
    state(string a)
    {sname=a;}
};
template<typename T>struct Link
{
    T*data;
    Link*extradata;
    Link*next;

    Link()
    {}
    Link(T*a,Link<T>*C=NULL)
    {
        data=a;
        next=C;

    }

};
template<typename T>
struct List
{int length;
    Link<T>*Head,*tail;
    List(Link<T>*h=NULL, Link<T>*t=NULL)
    {
        Head=h;
        tail=t;
        length=0;
    }

    void add(T*object)
    {
        {   if (Head == NULL && tail == NULL)
        {   Link<T> * newlink = new Link<T>(object);
            Head = newlink;
            tail = Head;  }
        else
        {   Link<T> * newlink = new Link<T>(object);
            tail->next = newlink;
            tail=newlink;} }
    }

Link<person> * find_person(string Fname, string Lname)//finds person based on user input
{
    Link<person>* first;
    Link<person> * temp = first;

    while (temp != NULL)
    {
        if (temp->data->fname==Fname && temp->data->lname==Lname )
        {

            return temp;

        }

        temp = temp->next;
    }
    return NULL;
}

void print_person(Link<person> * printP)//prints person and all info
{
    if (printP == NULL)
        cout << "No people match search\n\n";
    else
    {
        cout << "SEARCH RESULTS FOR PERSON: \n" << "First Name: " << printP->data->fname <<
        "\n Last Name: " << printP->data->lname <<
        "\n Birthday: " << printP->data->dob <<
        "\n Social Security #:  " << printP->data->ss_number <<
        "\n State of Residence: "<< printP->data->state<<"\n\n";


    }
}

};
List<person>*person_from_file(string file)//reads file of people
{
    List<person>* newlist=new List<person>();
    //        Link<T> * head=NULL;
    //        Link<T> * temp=NULL;
    ifstream fin;
    fin.open("data.txt");
    if (fin.fail())
        cout<<"file not found\n";
    if (!fin.fail())
    {
        while(true)
        {
            int a,b;
            string c,d,e;
            fin>>a>>b>>c>>d>>e;
            if (fin.fail())break;
            person * p=new person(a,b,c,d,e);
            newlist->add(p);


        }
    }
    else
        cout<<"Can't open file";
    fin.close();
    return newlist;
}
List<state>*state_from_file(string file)//reads file of states
{
    List<state>* newlist=new List<state>();
    //        Link<T> * head=NULL;
    //        Link<T> * temp=NULL;
    ifstream fin;
    fin.open("data.txt");
    if (fin.fail())
        cout<<"file not found\n";
    if (!fin.fail())
    {
        while(true)
        {
            int a,b;
            string c,d,e;
            fin>>a>>b>>c>>d>>e;
            if (fin.fail())break;
            state * s=new state(e);
            newlist->add(s);


        }
    }
    else
        cout<<"Can't open file";
    fin.close();
    return newlist;
}

int main()
{List<person>*A = person_from_file("data.txt");
 List<state> *B= state_from_file("data.txt");
    cout<<"Search for Person: ";

    string f,l;
    cin>>f>>l;
    Link<person> *x=A->find_person(f,l);
    A->print_person(x);



    return 0;
}

1 个答案:

答案 0 :(得分:1)

代码肯定不正确。以下是我发现的一些事情(列表不太可能完整):

  1. List构造函数在我能想到的几乎所有方面都被误导了:

    1. 很少有理由不使用成员初始化列表(尽管这是其中最少的问题)。
    2. 如果构造函数被赋予头部和尾部,则长度肯定是错误的。
    3. 如果给出头部或尾部而不是其他部分会发生什么?似乎会使列表处于不一致状态(嗯,从您的实现中不清楚不变量应该是什么)。
    4. 建议:将链接作为参数,并始终将列表初始化为空!或者,将作为参数,并通过遍历列表来确定尾部。

    5. List似乎创建节点,即它必须拥有元素。如果是这样,它显然需要一个析构函数释放它们,复制构造函数和复制赋值来复制列表(或者可以删除它们以禁止复制列表)。
    6. List的不变量应该是,如果设置headtail指向List中的最后一个元素。如果是这样,您只需要测试Headtail(顺便说一句,您应该一致地命名您的成员,可能是headtail
    7. 您的add()函数从未设置Head。这显然是错误的。
    8. 常见操作(创建newlink)应该通过公共代码完成:只有在检查条件后才需要创建代码。所有需要有条件的是如何建立事物。使用一个常见技巧(即指向尾节点而不是尾节点的指针tail)完全删除条件!
    9. first中的
    10. find_person()未初始化。因此,代码是未定义的。无论发生什么事。
    11. 分配的person对象在哪里发布?换句话说:该程序充满了内存泄漏。