我有一个用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/
调试这个的一个好方法是打印你所做的所有比较
(此外,我认为这是学习代码,而不是生产代码,因为它充满了缓冲区溢出错误。)
您的插入代码确保您的列表只有一个节点。该节点的数据将被覆盖以存储最后输入的数据。这就是为什么你的搜索操作会失败。
您的插件需要做的是:
- 为节点分配内存
- 初始化它的所有成员,并确保将
next
指针设置为NULL!这样做可以避免在最意想不到的时候调用未定义的行为 - 将这个已分配的节点作为您的头节点
- 有一个临时节点指针,比如
temp
,它指向头节点请勿为此节点分配内存。这样做=内存泄漏 - 为另一个节点分配内存
- 填充该节点的数据并将
next
指针初始化为NULL - 使
temp->next
指向步骤5中分配的节点 - 将
temp
移动到步骤5中分配的节点(由temp = temp->next
) - 如果需要更多节点,请转至步骤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崩溃告终;不执行。