Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 04. 05. 2009 23:36

fal.lukas
Zelenáč
Příspěvky: 2
Reputace:   
 

C: Spojový seznam, třídění shake sort

Dobrý den, chtěl jsem se zeptat jestli by tady nebyl někdo tak hodný, co by mi udělat spojový seznam , který by třídil shake sortem a nakonec seřazený výpis zobrazil, a uložil to souboru, třeba textového.

Code:

/* spojovy seznam */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <conio.h> 

typedef struct 
{ 
    int den,mesic,rok; 
} TDatum; 

typedef struct PStudent 
{ 
    char jmeno[10],prijmeni[20]; 
    TDatum datnar; 
    int id; 
    PStudent *dalsi; 
} TStudent; 

TStudent *prvni,*student; 

int PridejStudenta(char jmeno[10],char prijmeni[20], 
                   int dennar,int mesicnar,int roknar,int id) 
{ 
    student=(TStudent *) malloc(sizeof(TStudent)); 
    if (student==NULL) 
    { 
        printf("Nepodarilo se pridat studenta\n"); 
        return 0; 
    } else 
    { 
        student->dalsi=prvni; 
        prvni=student; 
        strcpy(student->jmeno,jmeno); 
        strcpy(student->prijmeni,prijmeni); 
        student->datnar.den=dennar; 
        student->datnar.mesic=mesicnar; 
        student->datnar.rok=roknar; 
        student->id=id; 
        return 1; 
    } 
} 

void VypisStudenty() 
{ 
    printf("\nVypis studentu\n************************\n"); 
    for (student=prvni;student!=NULL;student=student->dalsi) 
    { 
        printf("%s %s\n",student->jmeno,student->prijmeni); 
    } 
    printf("***********************\n\n"); 
} 

void Uloz() 
{ 
    FILE *f; 
    f=fopen("test.dat","wb"); 
    for (student=prvni;student!=NULL;student=student->dalsi) 
    { 
        fwrite(student,sizeof(TStudent),1,f); 
    } 
    fclose(f); 
    printf("Studenti ulozeni"); 
} 

void Nacti() 
{ 
    TStudent *st; 
    FILE *f; 
    f=fopen("test.dat","rb"); 
    st=(TStudent *) malloc(sizeof(TStudent)); 
    int p; 
    while ((p=fread(st,sizeof(TStudent),1,f))==1) 
        PridejStudenta(st->jmeno,st->prijmeni,st->datnar.den,st->datnar.mesic,st->datnar.rok,st->id); 
    fclose(f); 
    printf("Studenti nacteni"); 
} 

void Pridej() 
{ 
    char jmeno[10],prijmeni[20]; 
    int den,mesic,rok,id; 
    printf("Jmeno studenta:"); 
    scanf("%s",jmeno); 
    printf("Prijmeni studenta:"); 
    scanf("%s",prijmeni); 
    printf("Den narozeni:"); 
    scanf("%d",&den); 
    printf("Mesic narozeni:"); 
    scanf("%d",&mesic); 
    printf("Rok narozeni:"); 
    scanf("%d",&rok); 
    printf("ID:"); 
    scanf("%d",&id); 
    PridejStudenta(jmeno,prijmeni,den,mesic,rok,id); 
    printf("Student pridan"); 
} 

int main(void) 
{ 
    prvni=NULL; 
    char volba=0; 
    int nacteno=0; 
    do { 
        printf("\n"); 
        if (volba=='p') Pridej(); 
        if (volba=='u') Uloz(); 
        if (volba=='v') VypisStudenty(); 
        if (volba=='n' && nacteno==0) { Nacti();nacteno=1;} //Soubor studentu lze z disku nacist jen jednou 

        printf("\nHlavni nabidka\n"); 
        printf("--------------\n"); 
        printf("p..Pridat studenta\n"); 
        printf("v..Vypis studenty\n"); 
        printf("u..Ulozit ulozit studenty na disk\n"); 
        if (nacteno==0) printf("n..Nahrat studenty z disku\n\n"); //Zobrazi se pouze, pokud nebyli studenti nacteni 
        printf("k..Konec\n\nVase volba?"); 
    } while ((volba=getch())!='k'); 

} 

/* Shake sort */ 
#include <stdio.h> 
#include<string.h> 

char *a[]={"Marie", "Lukas", "Katka", "Alena"}; 
int N=sizeof(a)/sizeof(a[0]); 

int i,j,k, zmena; 
void dopredu() 
{ 
    for(j=k;j< i-1;j++) 
    { 
        if (strcmp(a[j], a[j+1]) > 0) 
        { char *pom=a[j]; 
        a[j]=a[j+1]; 
        a[j+1]=pom; 
        zmena=1; 
        } 
    } 
} 

void zpatky() 
{ 
    for(k=j-1;k> N-i;k--) 
    { if (strcmp(a[k], a[k-1]) < 0) 
    { 
        char *pom=a[k]; 
        a[k]=a[k-1]; 
        a[k-1]=pom; 
        zmena=1; 
    } 
    } 
} 

void shakesort() 
{ 
    i=N; 
    k=0; 
    do 
    { zmena=0; 
    dopredu(); 
    zpatky(); 
    i--; 
    }while(zmena!=0&&i!=0); 
} 

int main() 
{ 
    shakesort(); 
    for(i=0;i<N;i++)printf("%s ",a[i]); 
    getch(); 
    return 0; 
}

Moc děkuji.
Lukáš

Offline

 

#2 05. 05. 2009 16:14 — Editoval gladiator01 (05. 05. 2009 16:18)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: C: Spojový seznam, třídění shake sort

když to dáš do [  code][  /code] (bez těch mezer)
tak se tak to bude čitelnější a zachová a se ti formátování.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#3 13. 05. 2009 15:14

fal.lukas
Zelenáč
Příspěvky: 2
Reputace:   
 

Re: C: Spojový seznam, třídění shake sort

dík

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson