c++ - 链表帮助c++

标签 c++ templates linked-list

基本上,我需要帮助的是初始化我的 find_person 和 print_person 方法以在 main 中工作。现在,当我运行该程序时,除了 main 中的 cout 和 cin 之外,什么也没有发生。这些方法即使不完全正确也非常接近(如果不正确请告诉我)(仅供引用,状态和人员信息来自同一个文件,我只是获取人员对象的所有信息和状态字符串对于状态对象。)任何帮助将不胜感激谢谢。

#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. List 构造函数在我能想到的几乎所有方面都被误导了:

    1. 很少有充分的理由不使用成员初始值设定项列表(尽管这是最不重要的问题)。
    2. 如果给构造函数一个头部和一个尾部,那么长度肯定是错误的。
    3. 如果给它一个头或一个尾部而不给另一个,会发生什么?这似乎会使列表处于不一致状态(好吧,从您的实现中不清楚不变量应该是什么)。

    建议:不要将链接作为参数并始终将列表初始化为空!或者,一个头部作为参数,并通过遍历列表来确定尾部。

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

关于c++ - 链表帮助c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29583965/

相关文章:

c++ - 如何在函数参数中强制类型并避免隐式转换?

c++ - 评估不同参数的 constexpr 函数时的运行时差异

Django 模板查找顺序

c++ - 当我使用模板将一个字符数组复制到另一个数组时出现问题

c++ - Armadillo vector 类的 RcppArmadillo 样本

c++ - 为函数禁用基于参数的模板参数推导的更好方法?

c++ - 模板元编程或运算

java - 如何编写一个高效的 JPQL 查询来返回表中链接记录的列表?

java - 替换双链表中的节点

c++ - 通过引用传递无效时通过传递链表在第 n 个位置添加元素