我需要一个用C语言编写的程序的帮助,它涉及到通过有序插入将数据插入到列表中。必须先按姓氏排序,如果发现两个相同的姓氏,则必须按名称排序。我抛出了两行代码,但如果姓氏相同,则不会按名称排序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct vettura
{
char marca[11];
char modello[21];
int anno;
struct vettura *next;
};
struct lista
{
char cognome[21];
char nome[21];
char fiscale[12];
char email[21];
struct vettura *vet;
struct lista *next;
};
void socio(struct lista **list)
{
struct lista *p,*t=*list,*g;
p=(struct lista*)malloc(sizeof(struct lista));
p->next=NULL;
p->vet=NULL;
fflush(stdin);
printf("Insert surname: ");
gets(p->cognome);
fflush(stdin);
printf("Insert name: ");
gets(p->nome);
fflush(stdin);
if(*list==NULL)
{
*list=p;
return;
}
else
{
for(g=*list;g!=NULL&&(strcmp(g->cognome,p->cognome)<0);t=g,g=g>next)
{
printf("Cognome in lista: %s \t",g->cognome);
printf("Conome da inserire: %s \n",p->cognome);
if(strcmp(t->cognome,p->cognome)==0)
{
if(strcmp(t->nome,p->nome)<0)
{
break;
}
}
}
if(t==g)
{
p->next=*list;
*list=p;
return;
}
else
{
t->next=p;
p->next=g;
return;
}
}
}
void stampa(struct lista **list)
{
struct lista *scorri=*list;
while(scorri!=NULL)
{
printf("surname: %s \t name: %s \n",scorri->cognome,scorri->nome);
scorri=scorri->next;
}
}
int main()
{
struct lista *list=NULL;
socio(&list);
socio(&list);
socio(&list);
stampa(&list);
}
我做错什么了?
最佳答案
当违反条件strcmp(g->cognome,p->cognome)<0
时,循环终止。它包括strcmp(g->cognome,p->cognome) == 0
情况。
这意味着if(strcmp(t->cognome,p->cognome)==0)
子句永远不会到达/执行。把它从圈里拿出来。
关于c - 条目按链接列表中的姓名和姓氏排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52279539/