使用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; } struct节点{ 字符名[60]; 字符输入[10]; 煤焦品位; 节点*下一步; }; 节点*搜索(节点*头){ 节点*温度=头部; 字符名[60]; 你能用错误的方法复制名字吗 strcpy(name, temp->name);

使用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; } struct节点{ 字符名[60]; 字符输入[10]; 煤焦品位; 节点*下一步; }; 节点*搜索(节点*头){ 节点*温度=头部; 字符名[60]; 你能用错误的方法复制名字吗 strcpy(name, temp->name);,c++,c,linked-list,C++,C,Linked List,应该是 strcpy(temp->name, name); 首先到达目的地: 调试的一个好方法是打印您所做的所有比较 (另外,我认为这是学习代码而不是生产代码,因为它充满了缓冲区溢出漏洞。)strcpy似乎受到了重新评价 应该是 strcpy(临时->名称,名称); strcpy(临时->入学,入学) 由于未执行temp->next=NULL;,程序也可能以崩溃告终。插入代码确保列表只有一个节点。该节点的数据将被覆盖以存储最后输入的数据。这就是搜索操作失败的原因 您的插入需要做的是: 为

应该是

strcpy(temp->name, name);
首先到达目的地:

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


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

strcpy似乎受到了重新评价

应该是 strcpy(临时->名称,名称); strcpy(临时->入学,入学)


由于未执行temp->next=NULL;,程序也可能以崩溃告终。

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

您的插入需要做的是:

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

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

    strcpy(destination, source);
    
    我建议你读一下这本书,以便更清楚地理解

    此外,为什么不使用
    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;
    }
    
    #包括 使用名称空间std; #定义名称\u大小60 #定义行政单位大小10 结构节点{ 字符名称[名称大小]; 字符许可[ADMI_SIZE]; 煤焦品位; 节点*下一步; }; 节点*搜索(节点*头){ 节点*温度=头部; 字符名称[名称大小]; cout品位=品位; 温度->下一步=头部; 压头=温度; i++; } 搜查(头部); 下降(头); 返回0; }
    除I/O之外,这主要是C,而不是C++——这就是你真正想要的。你的插入是不正确的。是的,除了SERVERH()操作之外,一切都很好。你的插入函数只是替换了其中的一个元素。您从来没有超过1个元素。每次执行“head=temp;”时,插入的元素肯定是不正确的,因此您的列表只是创建的最后一个元素。+1忽略了这一点。他也只为整个循环分配一个节点并覆盖它。@JoachimIsaksson这也是真的。我根据上面给出的更正编辑了代码。请指引我在代码中的其他错误…我是C++中的NOOB)