条目按链接列表中的姓名和姓氏排序

时间:2018-09-11 15:34:54

标签: c

我需要用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);
 }

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

当违反条件strcmp(g->cognome,p->cognome)<0时,循环终止。它包括strcmp(g->cognome,p->cognome) == 0情况。

这意味着if(strcmp(t->cognome,p->cognome)==0)子句永远不会到达/执行。将其带出循环。