C: Spojový seznam, shake sort

Pokračování základního kursu programování pro studenty 1. ročníku bakalářského studia informatiky a učitelství informatiky. Výuka bezprostředně navazuje na předmět PRG030 Programování I výkladem dalších algoritmů a jejich programové realizace, postupů a technik užívaných při tvorbě programů. Posluchači se seznámi se základy objektového programování a práce v současných vývojových prostředích. Předpokládají se vstupní znalosti v rozsahu předmětu PRG030 Programování I.
LukasF

C: Spojový seznam, shake sort

Příspěvek od LukasF »

Dobrý den, chtěl jsem se zeptat jestli by tady nebyl někdo tak hodný, co by mi pomohl 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.
/* 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
");
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("
Vypis studentu
************************
");
for (student=prvni;student!=NULL;student=student->dalsi)
{
printf("%s %s
",student->jmeno,student->prijmeni);
}
printf("***********************

");
}

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("
");
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("
Hlavni nabidka
");
printf("--------------
");
printf("p..Pridat studenta
");
printf("v..Vypis studenty
");
printf("u..Ulozit ulozit studenty na disk
");
if (nacteno==0) printf("n..Nahrat studenty z disku

"); //Zobrazi se pouze, pokud nebyli studenti nacteni
printf("k..Konec

Vase 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);
getch();
return 0;
}

Moc děkuji.
Lukáš
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Re: C: Spojový seznam, shake sort

Příspěvek od hippies »

fuj, to je ale kod :roll:

.. zkus se neco naucit a napis si to :wink:
Chjo, dovede te si představit svět, kde by byla každá harmonická diferenciální forma (jistého typu) nesingulární projektivní algebraické variety racionální kombinací kohomologických tříd algebraických cyklů..
Lukyas

Re: C: Spojový seznam, shake sort

Příspěvek od Lukyas »

hippies píše:fuj, to je ale kod :roll:

.. zkus se neco naucit a napis si to :wink:
:arrow: to bych se asi neptal na foru andminko :D :idea:
svick
Matfyz(ák|ačka) level I
Příspěvky: 18
Registrován: 22. 2. 2008 19:19
Typ studia: Informatika Mgr.
Bydliště: 17. listopad

Re: C: Spojový seznam, shake sort

Příspěvek od svick »

Já bych řekl, že shake sort u jednosměrného spojového seznamu ani nejde. Jedině, že by sis uložil do pole ukazatele na prvky seznamu, ale to už bys mohl rovnou použít pole.
Uživatelský avatar
Tuetschek
Supermatfyz(ák|ačka)
Příspěvky: 657
Registrován: 15. 6. 2005 13:54
Typ studia: Nestuduji ale učím na MFF
Kontaktovat uživatele:

Re: C: Spojový seznam, shake sort

Příspěvek od Tuetschek »

svick píše:Já bych řekl, že shake sort u jednosměrného spojového seznamu ani nejde. Jedině, že by sis uložil do pole ukazatele na prvky seznamu, ale to už bys mohl rovnou použít pole.
Yup, to nejde ... je potreba obousmerny 8) .
Plug 'n' Pray.
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Re: C: Spojový seznam, shake sort

Příspěvek od hippies »

jde, ale ta slozitost nebude hezka;)
Lukyas píše:
hippies píše:fuj, to je ale kod :roll:

.. zkus se neco naucit a napis si to :wink:
:arrow: to bych se asi neptal na foru andminko :D :idea:
ty se neptas, ty zadavas
Chjo, dovede te si představit svět, kde by byla každá harmonická diferenciální forma (jistého typu) nesingulární projektivní algebraické variety racionální kombinací kohomologických tříd algebraických cyklů..
Odpovědět

Zpět na „PRG031 Programování II“