1

データ値を挿入した直後に検索したい、C++ で実装されたリンク リストがあります。検索するレコードは、ユーザーから要求されます。しかし、検索機能が期待どおりに機能せず、「一致が見つかりません」を返し続けます。何が問題なのですか?

struct node{
    char name[60];
    char admission[10];
    char grade;
    node *next;
};

node* search(node* head){
    node *temp=head;
    char name[60];
    cout << "Enter Student to search :";
    cin.ignore(10000, '\n');
    cin.getline(name, 60);
    cout << name;
        while (temp!=NULL){
            if(strcmp(temp->name, name)==0){
                cout << "Match found";
                return temp;
            }
            temp = temp->next;
        }
        cout << "No match found";
        return NULL;
}

int main(){
    node *head = NULL;

    char name[60];
    char admission[10];
    char grade;

    node *temp;
    temp = (node*)malloc(sizeof(node));
    int i=0;

    while(i<2){
        cout << "Enter students name: ";
        cin.ignore(10000, '\n');
        cin.getline(name, 60);
        cout << "Enter student's admission number: ";
        cin.getline(admission, 10);
        cout << "Enter student's grade :";
        cin >> grade;
        strcpy(temp->name, name);
        strcpy(temp->admission,admission);
        temp->grade = grade;
        head = temp;
        i++;
    }
    search(head);
    return 0;
}
4

4 に答える 4

1
#include <iostream>
#include <cstring>

using namespace std;

#define NAME_SIZE 60
#define ADMI_SIZE 10

struct node{
    char name[NAME_SIZE];
    char admission[ADMI_SIZE];
    char grade;
    node *next;
};

node* search(node* head){
    node *temp=head;
    char name[NAME_SIZE];
    cout << "Enter Student to search :";
    cin.getline(name, NAME_SIZE);
    cout << name;
    while (temp!=NULL){
        if(strcmp(temp->name, name)==0){
            cout << " Match found";
            return temp;
        }
        temp = temp->next;
    }
    cout << " No match found";
    return NULL;
}

void drop(node* n){
    if(n == NULL) return;
    drop(n->next);
    delete n;
}

int main(){
    node *head = NULL;

    char name[NAME_SIZE];
    char admission[ADMI_SIZE];
    char grade;

    int i=0;

    while(i<2){
        cout << "Enter students name: ";
        cin.getline(name, 60);
        cout << "Enter student's admission number: ";
        cin.getline(admission, 10);
        cout << "Enter student's grade :";
        cin >> grade;
        cin.ignore(10000, '\n');
        node *temp = new node;
        strcpy(temp->name, name);
        strcpy(temp->admission,admission);
        temp->grade = grade;
        temp->next = head;
        head = temp;
        i++;
    }
    search(head);
    drop(head);
    return 0;
}
于 2013-07-02T09:15:46.807 に答える
1

挿入コードにより、リストにノードが 1 つしかないことが保証されます。そのノードのデータは上書きされ、最後に入力されたデータが保存されます。これが、検索操作が失敗する理由です。

挿入する必要があるのは次のとおりです。

  1. ノードにメモリを割り当てます。
  2. すべてのメンバーを初期化し、nextポインターを NULL に設定してください。そうすることで、予期しないときに未定義の動作が呼び出されるのを回避できます。
  3. この割り当てられたノードをヘッド ノードにします。
  4. tempヘッド ノードを指す一時的なノード ポインタ、たとえばを用意します。このノードにメモリを割り当てないでください。そうする=メモリリーク。
  5. 別のノードにメモリを割り当てます。
  6. そのノードのデータを取り込み、ポインターを NULLに初期化nextします。
  7. 手順temp->next5 で割り当てたノードを指定します。
  8. temp手順 5 で割り当てたノードに移動します ( temp = temp->next)。
  9. さらにノードが必要な場合は、手順 5 に進みます。それ以外の場合は、検索を続けます。

このコードをより大きなコードベースのモジュールとして使用すると、メモリリークが発生するため、各ノードに割り当てたメモリを必ず解放してください。

また、他の回答が指摘しているように、あなたのstrcpy使い方は間違っています。基本的に、構文は次のとおりです。

strcpy(destination, source);

より明確に理解するために、のマニュアルstrcpyを読むことをお勧めします。

さらに、new代わりに? を使用してみませんmallocか?

于 2013-07-02T07:01:31.523 に答える