使用c++在链表中搜索操作



我有一个用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;
}

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

strcpy(name, temp->name);

应该是

strcpy(temp->name, name);

首先到达目的地:http://www.cplusplus.com/reference/cstring/strcpy/

调试这个的一个好方法是打印你所做的所有比较

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

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

您的插件需要做的是:

  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呢?

#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;
}

strcpy似乎被逆转了。

应该是strcpy(temp->name,name);strcpy(临时->入院,入院);

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

相关内容

  • 没有找到相关文章