Сортировка по алфавиту динамического списка

Тема в разделе "Общие вопросы по С и С++", создана пользователем AlexSat, 1 май 2009.

  1. AlexSat

    AlexSat Гость

    Третий день мудохаюсь с задачей, ни как не могу отсортировать в алфовитном порядке абитуриентов
    (функция - void FilterVedomost(AbiturPtr *firstPtr)), может кто нибудь подскажет, что делать? [codebox]

    /*1. Дана ведомость абитуриентов. В каждой строке записана фамилия абитуриента, его постоянное
    место жительства, средний балл аттестата. Распечатать в алфавитном порядке список абитуриентов,
    проживающих в Минске и определить их количество.*/

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>

    struct Abitur
    {
    char lastname[20];
    char MestoZhit[20];
    char SrBal[1];
    struct Abitur *nextAbit;
    struct Abitur *prevAbit;
    };
    typedef Abitur *AbiturPtr;

    void CreatVedomost(AbiturPtr *firstPtr); //Функция создания ведомости
    void FilterVedomost(AbiturPtr *firstPtr); //Функция фильтрации ведомости в соответсвии с задачей
    void PrintVedomost(AbiturPtr *firstPtr); //Функция печати списка

    /********************************************************************************
    ***********/
    void main(void)
    {
    char ch;
    clrscr();
    AbiturPtr headPtr = NULL;
    printf("Vvedite dannie ob abitur'entah:\n");
    CreatVedomost(&headPtr);
    printf("Vedomst abitur'entov:\n");
    printf(" Famili'a | Mesto zhitel'stva | Sredni bal\n\n");
    PrintVedomost(&headPtr);
    FilterVedomost(&headPtr);
    PrintVedomost(&headPtr);
    getchar();
    }
    /********************************************************************************
    ***********/
    void CreatVedomost(AbiturPtr *firstPtr)
    {
    clrscr();
    AbiturPtr newPtr1;
    char prov;
    char mys[1];
    newPtr1 = (Abitur*)malloc(sizeof(Abitur));
    printf("Vvesti ocerednoi element? (yes-'y'/no-Enter)");
    prov=getchar();
    if(prov == 'y')
    {
    if (newPtr1 != NULL)
    {
    gets(mys);
    printf("Vvedite famili'j:\n");
    gets(newPtr1->lastname);
    printf("Vvedite mesto zhitelstva:\n");
    gets(newPtr1->MestoZhit);
    printf("Vvedite sredni bal:\n");
    gets(newPtr1->SrBal);
    newPtr1->nextAbit=*firstPtr; //список сдвигается на один
    //элемент, путем
    *firstPtr=newPtr1; //вставки на первое
    //место нового элемента
    CreatVedomost(&((*firstPtr)->nextAbit)); //рекурсивный вызов
    // функции создания
    }

    else
    {
    printf("Error!");
    }
    }
    else
    {
    printf("Vvod zakonchen\n\n");
    }
    };
    /********************************************************************************
    **********/
    void PrintVedomost(AbiturPtr *firstPtr)
    {

    if((*firstPtr)!= NULL) //провкрка конца списка
    {
    printf("%-20s",(*firstPtr)->lastname);
    printf("%-20s",(*firstPtr)->MestoZhit);
    printf("%-3s\n",(*firstPtr)->SrBal);
    PrintVedomost(&((*firstPtr)->nextAbit));//рекурсивный вызов функции печати элемента
    }
    else
    {
    printf("\nVivod zakonchen\n\n");
    }
    }
    /********************************************************************************
    ***********/
    void FilterVedomost(AbiturPtr *firstPtr)
    {
    AbiturPtr predEl, workPtr, work2Ptr, vsPtr;
    Abitur prom1, prom2;
    char Sity[20];
    int count, counter, srav;
    printf("Vvedite gorod\n");
    gets(Sity);
    printf("Spisok abiturientov iz %s\n",Sity);
    workPtr=*firstPtr;
    predEl=NULL;

    while(workPtr!=NULL)
    {
    if(strcmp(workPtr->MestoZhit,Sity)==0) count++;
    while(workPtr!=NULL && strcmp(workPtr->MestoZhit,Sity)==0)
    {
    predEl=workPtr;
    workPtr=workPtr->nextAbit;
    }
    if(predEl!=NULL)
    {
    predEl->nextAbit=workPtr->nextAbit;
    free(workPtr);
    }
    else
    {
    predEl=*firstPtr;
    *firstPtr=(*firstPtr)->nextAbit;
    free(predEl);
    }
    workPtr=workPtr->nextAbit;
    }
    //perestaniovka po alfavitu
    vsPtr=*firstPtr;
    :unsure:
    while(vsPtr!=NULL)
    {
    work2Ptr=vsPtr;
    counter=1;
    while(work2Ptr!=NULL)
    {
    work2Ptr=work2Ptr->nextAbit;//
    srav=strcmp((vsPtr->lastname),(work2Ptr->lastname));
    if(srav > 0)
    {
    if(counter==1)
    {
    prom1=*vsPtr;
    prom2=*work2Ptr;
    *vsPtr=prom2; //vistovlayem na pervoe mesto
    prom1.nextAbit=prom2.nextAbit;
    vsPtr->nextAbit=&prom1;

    }
    else
    {
    prom1=*vsPtr;
    prom2=*work2Ptr;
    *vsPtr=prom2; //vistovlayem na pervoe mesto
    vsPtr->nextAbit=prom1.nextAbit;
    *work2Ptr=prom1;
    work2Ptr->nextAbit=prom2.nextAbit;
    }
    }

    counter++;
    }
    //vsPtr=vsPtr->nextAbit;
    //}
    }
    /********************************************************************************
    *********/
    [/codebox]
     
Загрузка...

Поделиться этой страницей