程序应该对节点进行插入升序排序,首先它应该检查名称,如果名称相等,它应该对id排序,我不知道是什么问题排序不正确。
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
typedef struct nd{
int id;
char name[20];
float gpa;
struct nd *next;
}node;
typedef node *list;
//---------------------------------------------------------------
int insertlist(list *head,char *buffer)
{
list p,q,n;
int m,num,k,sc;
p=(list)malloc(sizeof(node));
num=sscanf(buffer,"%d %s %f",&(p->id),(p->name),(&p->gpa));
if(num!=3)
{
printf("info not complete\n");
free(p);
return 1;
}
else
{
if(!*head)
{
*head=p;
p->next = NULL;
}
//******** sorting tthe names and ids for equal names
else if(sc=strcmp((*head)->name,p->name)> 0 || ((sc == 0) && ((*head)->id > p->id)))
{//head is modified
p->next=*head;
*head=p;
}
else{
n=*head;
q=n->next;
while(q && ((sc=strcmp(q->name,p->name)<0) || ((sc == 0) && (q->id < p->id))))
{
n=q;
q=q->next;
}
n->next=p;
p->next=q;
}
}
return 0;
}
//------------------------------------------------------
int main()
{
int id,r;
list head,p;
FILE *fp;
char c,buffer[100],filename[10];
if ((fp=fopen("student.txt","r"))==NULL)
{
printf("error opening %s",filename);
exit(1);
}
else
{
head=NULL;
while(fgets(buffer,100,fp)!=NULL)
{
buffer[strlen(buffer)-1]=='\0';
r=insertlist(&head,buffer);
}
fclose(fp);
}
for(p=head;p!=NULL;p=p->next)
printf("%d %s %f\n\n",p->id,p->name,p->gpa);
}
student.txt
的内容示例:121513 ala 45.00
121510 wang 21.00
145852 frank 26.00
151515 ala 25.00
最佳答案
您的排序问题是operator precedence<
和>
的优先级高于=
,这意味着将首先对其进行评估,然后进行赋值。
因此,您的字符串在以下两个位置进行比较:
else if(sc=strcmp((*head)->name,p->name)> 0 || ((sc == 0) && ((*head)->id > p->id)))
...
while(q && ((sc=strcmp(q->name,p->name)<0) || ((sc == 0) && (q->id < p->id))))
都错了。
sc
分别得到strcmp((*head)->name,p->name)> 0
和strcmp(q->name,p->name)<0
的值(注意,这将始终是1
或0
,从不-1
)如果只是调整代码:
else if((sc=strcmp((*head)->name,p->name))> 0 || ((sc == 0) && ((*head)->id > p->id)))
...
while(q && (((sc=strcmp(q->name,p->name))<0) || ((sc == 0) && (q->id < p->id))))
你会看到它起作用的。这个故事的寓意是:不要吝啬你的paren或括号,它不会让你付出更多的代价,它会让代码更清晰,而且它也省去了像这样的调试麻烦。
关于c - c中的链表插入排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14337189/