首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用c++在链表中进行搜索操作

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

Stack Overflow用户
提问于 2013-07-02 14:42:08
回答 4查看 4.4K关注 0票数 1

我有一个用c++实现的链表,我想在插入数据值后立即搜索它。user.However提示要搜索的记录,搜索功能没有正常工作,一直返回No match found。可能的问题是什么?

代码语言:javascript
运行
复制
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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-02 15:01:32

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

您的插入需要做的是:

  1. 为node.
  2. Initialize的所有成员分配内存,并确保将next指针设置为NULL!这样做可以避免在你最意想不到的时候调用未定义的行为。
  3. 使这个分配的节点成为你的头节点。
  4. 有一个临时节点指针,比如temp,它指向头节点。不为此节点分配内存。这样做= memory leak.
  5. Allocate memory leak.
  6. Allocate node.
  7. Populate next NULL.
  8. Make temp = temp->next).
  9. Go 初始化指向步骤5中分配的节点的 data 指针,指向步骤5中分配的节点。
  10. temp移动到步骤5中分配的节点(如果需要更多节点,请通过temp = temp->next).
  11. Go移到步骤5)。否则,请继续搜索。

请确保释放为每个节点分配的内存,因为如果将此代码用作更大的代码库中的模块,则会出现内存泄漏。

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

代码语言:javascript
运行
复制
strcpy(destination, source);

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

另外,为什么不用malloc代替new呢?

票数 1
EN

Stack Overflow用户

发布于 2013-07-02 14:45:42

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

代码语言:javascript
运行
复制
strcpy(name, temp->name);

应该是

代码语言:javascript
运行
复制
strcpy(temp->name, name);

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

调试的一个好方法是打印出所有的比较结果。

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-02 14:50:51

strcpy似乎很受人尊敬。

应为strcpy(temp->name,name);strcpy(temp->admission,admission);

如果不执行temp->next = NULL;,程序也可能以崩溃告终。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17419032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档