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

2

您以错误的方式复制名称:

strcpy(name, temp->name);

应该

strcpy(temp->name, name);

目的地先行: http ://www.cplusplus.com/reference/cstring/strcpy/

调试此问题的一个好方法是打印您所做的所有比较。

(另外,我认为这是学习代码而不是生产代码,因为它充满了缓冲区溢出错误。)

于 2013-07-02T06:45:42.297 回答
1

您的插入代码确保您的列表只有一个节点。该节点的数据将被覆盖以存储最后输入的数据。这就是您的搜索操作会失败的原因。

您的插入需要做的是:

  1. 为节点分配内存。
  2. 初始化它的所有成员并确保将next指针设置为 NULL!这样做可以避免在您最不期望的时候调用未定义的行为。
  3. 将此分配的节点设为您的头节点。
  4. 有一个临时节点指针,比如说temp,它指向头节点。不要为此节点分配内存。这样做=内存泄漏。
  5. 为另一个节点分配内存。
  6. 填充该节点的数据并将指针初始化next为 NULL 。
  7. temp->next指向在步骤 5 中分配的节点。
  8. 移动temp到在步骤 5 中分配的节点(按temp = temp->next)。
  9. 如果您需要更多节点,请转到第 5 步。否则,请继续搜索。

确保释放为每个节点分配的内存,因为如果您曾经将此代码用作某些较大代码库中的模块,则会发生内存泄漏。

另外,正如其他答案所指出的那样,您的strcpy用法是错误的。基本上,语法是:

strcpy(destination, source);

我建议您阅读手册以strcpy获得更清晰的理解。

此外,为什么不使用new而不是malloc

于 2013-07-02T07:01:31.523 回答
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 回答
0

strcpy 似乎被推翻了。

它应该是 strcpy(temp->name, name); strcpy(temp->admission, admission);

此外,程序可能会以 temp->next = NULL 的形式崩溃;不执行。

于 2013-07-02T06:50:51.240 回答