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

时间:2013-07-02 06:42:08

标签: c++ c linked-list

我有一个用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 个答案:

答案 0 :(得分:2)

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

strcpy(name, temp->name);

应该是

strcpy(temp->name, name);

首先进入目的地:http://www.cplusplus.com/reference/cstring/strcpy/

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

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

答案 1 :(得分:1)

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

您的插件需要做的是:

  1. 为节点分配内存。
  2. 初始化所有成员,并确保将next指针设置为NULL!这样做可以避免在您最不期望的时候调用未定义的行为。
  3. 将此分配的节点作为头节点。
  4. 有一个临时节点指针,比如temp,它指向头节点。 不要为此节点分配内存。这样做=内存泄漏。
  5. 为另一个节点分配内存。
  6. 填充该节点的数据,next指针初始化为NULL
  7. 使temp->next指向在步骤5中分配的节点。
  8. temp移至步骤5中分配的节点(temp = temp->next)。
  9. 如果您想要更多节点,请转到步骤5。否则,继续搜索。
  10. 确保释放为每个节点分配的内存,因为如果您在某些较大的代码库中使用此代码作为模块,则会出现内存泄漏。

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

    strcpy(destination, source);
    

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

    此外,为什么不使用new代替malloc

答案 2 :(得分:0)

strcpy似乎很受尊敬。

应该是 strcpy(temp-&gt; name,name); strcpy(临时 - >入学,录取);

程序也可能因为temp-&gt; next = NULL而崩溃;没有执行。

答案 3 :(得分:0)

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