我的教授给我发了一个库来插入,删除和搜索链表中的元素:
#include <stdlib.h>
struct NODE
{
char AM[12];
char name[40];
int semester;
struct NODE *head;
struct NODE *next;
struct NODE *prev;
};
void init(struct NODE **head)
{
*head=NULL;
}
struct NODE *Search (struct NODE *head,char CODE[],struct NODE **prev)
{
struct NODE *tmp;
*prev=NULL;
tmp=head;
while (tmp!=NULL && tmp->AM<CODE)
{
*prev=tmp;
tmp=tmp->next;
}
if (tmp==NULL)
return NULL;
if (tmp->AM==CODE)
return tmp;
return NULL;
}
struct NODE *Search2 (struct NODE *head,char name[],struct NODE **prev)
{
struct NODE *tmp;
*prev=NULL;
tmp=head;
while (tmp!=NULL && tmp->name<name)
{
*prev=tmp;
tmp=tmp->next;
}
if (tmp==NULL)
return NULL;
if (tmp->name==name)
return tmp;
return NULL;
}
int Insert (struct NODE **H,struct NODE P)
{
struct NODE *cur,*prev;
cur=Search(*H,P.AM,&prev);
if (cur)
return 0;
cur=(struct NODE *)malloc(sizeof P);
*cur=P;
if (prev==NULL)
{
cur->next=*H;
*H=cur;
}
else
{
cur -> next = prev -> next;
prev -> next = cur;
}
return 1;
}
int Delete (struct NODE **H,char AM[])
{
struct NODE *cur,*prev,*next;
cur=Search(*H,AM,&prev);
if (!cur)
return 0;
if (prev==NULL)
cur=next;
else
prev->next=cur->next;
free(cur);
return 1;
}
void traverse (struct NODE *head)
{
struct NODE *cur;
cur=head;
while (cur)
{
printf ("%p\n",cur);
cur=cur->next;
}
}
现在这里是我创建的源文件中的一段代码,试图在链表中插入一个元素:
case 1:printf ("Input AM,name and semester of student: ");
tmp=(struct NODE *)malloc(sizeof(struct NODE));
if (tmp==NULL)
exit(1);
scanf("%s %s %d",tmp->AM,tmp->name,&tmp->semester);
_flag=Insert(&head,*tmp);
if(_flag)
printf ("Student inserted succesfully!\n");
free(tmp);
break;
当我插入元素时,我得到&#34;学生成功插入&#34;消息,但是当我调用搜索函数来查找该元素时,它返回NULL(意味着该元素不在列表中)。如何从头文件中调用Insert函数? (我假设问题必须在插入函数中)。在main()中我也声明了以下两个:
struct NODE *head;
struct NODE *tmp;
我应该改变这两个方面吗?
答案 0 :(得分:0)
我认为你的问题出现在Search()和Search2()函数中,你有这样的事情:
while (tmp!=NULL && tmp->AM<CODE)
和
if (tmp->AM==CODE)
return tmp;
您正在比较指针,而不是字符串的内容。如果要比较字符串,或者首先按字母顺序查找字符串,请使用strcmp()。
while (tmp!=NULL && strcmp(tmp->AM, CODE) < 0)
和
if (!strcmp(tmp->AM, CODE))
return tmp;
在Search2()中使用tmp-&gt;名称和名称进行比较也是如此。