我有一个用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;
}
答案 0 :(得分:2)
您以错误的方式复制名称:
strcpy(name, temp->name);
应该是
strcpy(temp->name, name);
首先进入目的地:http://www.cplusplus.com/reference/cstring/strcpy/
调试此方法的一个好方法是打印您所做的所有比较。
(另外,我认为这是学习代码而不是生产代码,因为它充满了缓冲区溢出错误。)
答案 1 :(得分:1)
您的插入代码可确保您的列表只有一个节点。将覆盖该节点的数据以存储输入的最后数据。这就是您的搜索操作失败的原因。
您的插件需要做的是:
next
指针设置为NULL!这样做可以避免在您最不期望的时候调用未定义的行为。temp
,它指向头节点。 不要为此节点分配内存。这样做=内存泄漏。next
指针初始化为NULL 。temp->next
指向在步骤5中分配的节点。temp
移至步骤5中分配的节点(temp = temp->next
)。确保释放为每个节点分配的内存,因为如果您在某些较大的代码库中使用此代码作为模块,则会出现内存泄漏。
此外,正如其他答案所指出的那样,您的strcpy
用法是错误的。基本上,语法是:
strcpy(destination, source);
我建议您阅读manual for strcpy
以获得更清晰的理解。
此外,为什么不使用new
代替malloc
?
答案 2 :(得分:0)
应该是 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;
}