0

私は c++ が初めてで、印刷機能に問題があります。これは非常に単純な問題かもしれませんが、解決方法がわかりません。

コードを書き始める前に、これは循環リストであることを付け加えておきます。

まず第一に、これが私の連結リスト構造です

struct CL;

typedef CL* list_type;

struct person
{
    string last_name;
    string first_name;
    string tel_nr;
};

struct CL
{
    person data;
    list_type next;
};

ご覧のとおり、リストにデータとポインターを含める必要があります。データは人(姓、名、電話番号(文字列))です。

私のメインプログラムは次のようになります

int main ()
{
    list_type list;
    list_type first;
    string line;
    person info;
    ifstream myfile ("INFILE.TXT");
    if (myfile.is_open())
    {
        while (myfile.good())
        {
            getline (myfile,line,',');
            info.last_name=line;
            getline(myfile,line,' ');
            getline(myfile,line,':');
            info.first_name=line;
            getline(myfile,line);
            info.tel_nr=line;
            if(first==0)
            {
                list = new CL;
                first = list;
                list->data = info;
                list->next = 0;
            }
            else
            {
                list->next = new CL;
                list = list->next;
                list->data = info;
                list->next = 0;
            }

        }

        list->next = first;
        print(list);
        myfile.close();
    }
    else cout<<"Unable to open file.";
    return 0;
}

そして今、私が問題を抱えている部分、印刷機能に。

void print(CL* cur)
{
    list_type first;
    first=cur;
    int x;
    do
    {
        cout<<"\n"<<"Your Data is: ";
        cout<<cur->data.last_name<<cur->data.first_name<<cur->data.tel_nr;
        //I guess this is where the fault lies ^.
        cur = cur->next;
    }
    while(cur != first);
}

可能であれば、正しいコードだけでなく、説明が欲しいです。

ありがとう

編集。私が得ている結果は、次のような多くの奇妙な文字です。

ê,(,?,ý and alot of other characters I don't know how to type.

私が期待している結果は、このようなものです

Robertson Linda 0838-2345
Brown Charles 068-24567
etc until the end of list

編集2。

解決しました。

4

2 に答える 2

2

最初の問題

int main ()
{
    list_type list;
    list_type first; // uninitialized value
    // ...
            if(first==0) // ???
            {

firstこれを期待どおりに行うには、明示的に初期化する必要があります。

int main ()
{
    list_type list;
    list_type first = 0;
    // ...
            if(first==0)
            {

第二の問題

あなたのリンクされたリストのコードは、実際には (慣用的な) C++ を書いていないため、そもそも脆弱です。STL を使用しなくても、リストはある程度の抽象化を提供できます (また提供する必要があります)。実際には、データ構造のロジックがテスト ハーネスや問題ドメインのロジックと混同されないため、適切に記述する方が簡単です。

例えば、

class PersonList {
    CL *head;
    CL *tail;

public:
    PersonList(); // think about how to initialize an empty list

    void push_back(Person const&); // head & tail modified in here
    // etc.
};

の使用が許可されていない場合class、これは同じであることに注意してください。

struct PersonList {
private:
    CL *head;
    // ... as above ...

コンストラクターとメソッドの使用がまったく許可されていない場合、適切な C スタイルの同等物は次のようになります。

struct PersonList {
    CL *head;
    CL *tail;
};
struct PersonList * new_list();
void push_back(struct PersonList *, Person const &);

これは、ビジネス ロジック/問題ドメイン/テスト ハーネス コードから離れて、データ構造コードを 1 か所にグループ化します。

于 2013-02-28T16:48:51.327 に答える
0

最初にゼロに初期化します。最初のリンクが初期化されていないため、悪い文字が表示されます。

于 2013-02-28T16:37:56.160 に答える