Kezdőoldal » Számítástechnika » Programozás » C-ben egy dinamikus listába...

Elektromann kérdése:

C-ben egy dinamikus listába hogyan tudok új elemet beszúrni, egy másik műveletben törölni?

Figyelt kérdés

Már egy ideje foglalkozok a C programozás tanulásával. Jelenleg a struktúránál, azon belül a dinamikus listával próbálkozok. A gyakorló feladatban személyes adatokat kell tárolni, amibe később lehet beszúrni új elemeket, és törölni régieket.

Természetesen leírja az elméletet, de nem értettem meg, ezért nem tudom elképzelni se, hogyan kell hozzáadni.

Törléssel megpróbálkoztam, sikertelenül...

Így próbáltam törölni:

int s;

printf("Mit szeretne torolni?\n");

scanf("%d",&s);

akt=fej;

int f;

for(f=1;f<=s;f++){

if(f==s){

elo->kovt=kov;

elo=kov;

}

akt=akt->kovt;

}


És ez a struktúrám:

struct szemely{

int szev;

char nev[100], cim[1000];

struct szemely *kovt;

};


struct szemely *fej=NULL,*elo,*akt,*kov;


Valaki tud nekem segíteni?



2015. ápr. 4. 18:14
 1/5 anonim ***** válasza:

Hogyan építed fel a listádat?

Ugyanúgy tudsz beszúrni.

Törlésnél pedig először kifűzöd a törlendő elemet, majd felszabadítod.

Teljes kódot ossz meg valami kódmegosztón keresztül.

A törlésed finoman szólva is borzasztó.

For ciklussal iterálni listán???

Nem is értem mi a fenét akarsz ott csinálni.

2015. ápr. 4. 18:48
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:

Nem állítod be az előzőt minden iteráció végén:


elo=akt;

akt=akt->kov;

2015. ápr. 4. 19:45
Hasznos számodra ez a válasz?
 3/5 A kérdező kommentje:

Nem akartam a teljes listát beszúrni, mert hosszú, de akkor itt van, remélem így tudtok segíteni. Bele írtam a második hozzászóló ötletét is, de az sem vált be. Egyébként meg a for ciklussal akartam kikeresni, hogy melyikre van szükség. Mert nem így kell?


#include <stdio.h>

#include <stdlib.h>

#include <string.h>


struct szemely{

int szev;

char nev[100], cim[1000];

struct szemely *kovt;

};


struct szemely *fej=NULL,*elo,*akt,*kov;


void lst(){

akt=fej;

while(akt!=NULL){

printf("%s adatai:\n",akt->nev);

printf("Cime: %s\n",akt->cim);

printf("Szuletett: %d\n\n",akt->szev);

akt=akt->kovt;

}

}


void trl(){

int s;

char b;

printf("Mit szeretne torolni?\n");

printf("Tovabbi lehetosegek: -1=megsem; 0=listazas.\n");

printf("Kerem a szamot: ");

scanf("%d",&s);

if(s!=-1){

if(s==0){

akt=fej;

while(akt!=NULL && s==0){

printf("\nNev: %s\n",akt->nev);

printf("Cim: %s\n",akt->cim);

printf("Szuletett: %d\n",akt->szev);

printf("t=torles, f=fojtatas, m=megsem\n");

scanf("%c",&b);

if(b=='t'){

elo->kovt=kov;

elo=kov;

s=1;

}

if(b=='m') s=1;

elo=akt;

akt=akt->kovt;

}

}

else{

akt=fej;

int f;

for(f=1;f<=s;f++){

if(f==s){

elo->kovt=kov;

elo=kov;

}

elo=akt;

akt=akt->kovt;

}

}

}

}


void ker(){

char b[3];

int e;

printf("Nev vagy szuletesi ev alapjan?\n");

scanf("%s",&b);

printf("Mit keres?\n");

if(b[0]=='e' && b[1]=='v') scanf("%d",&e);

else{

char n[100];

scanf("%s",&n);

}

akt=fej;

printf("Talalatok:\n");

while(akt!=NULL){

if(b[0]=='e' && b[1]=='v' && akt->szev==e){

printf("Nev: %s\n",akt->nev);

printf("Cim: %s\n",akt->cim);

printf("Szuletesi ev: %d\n\n",akt->szev);

}

akt=akt->kovt;

}

}


void uj(){

printf("Ez a funkcio meg nem hasznalhato!\n\n");

}


main(){

char bn[100],bc[1000],c;

int s=1,bi;

printf("A kezdeshez nyomjon le egy gombot!\n");

while((c=getch())!=27){

printf("Kerem a/az %d. szemely adatait:\n",s);

printf("Nev: ");

scanf("%s",&bn);

printf("Cim: ");

scanf("%s",&bc);

printf("Szuletesi ev: ");

scanf("%d",&bi);

printf("\nFolytatashoz nyomjon meg egy gombot, vagy kelepes az ESC gombbal!\n");


akt=(struct szemely *) malloc(sizeof(struct szemely));

if(!akt){

printf("Memoria hiba!");

return -1;

}

strcat(akt->nev,bn);

strcat(akt->cim,bc);

akt->szev=bi;

akt->kovt=NULL;

if(s==1) fej=elo=akt;

else{

elo->kovt=akt;

elo=akt;

}

s++;

}

system("CLS");

char p[50];

s=1;

while(s==1){

printf("Kerem a parancsot: ");

scanf("%s",p);

if(p[0]=='k' && p[1]=='l' && p[2]=='s') s=0;

else{

if(p[0]=='s' && p[1]=='g' && p[2]=='t'){

printf("A kovetkezo parancsok hasznalhatok:\n");

printf("kls: Kilepes\nsgt: Segitseg\nkts: Kepernyo torlese\n");

printf("lst: Listazas\ntrl: Torles\nuj: Uj beszurasa\n");

printf("ker: Kereses\n\n");

}

else{

if(p[0]=='k' && p[1]=='t' && p[2]=='s') system("CLS");

else{

if(p[0]=='l' && p[1]=='s' && p[2]=='t') lst();

else{

if(p[0]=='t' && p[1]=='r' && p[2]=='l') trl();

else{

if(p[0]=='k' && p[1]=='e' && p[2]=='r') ker();

else{

if(p[0]=='u' && p[1]=='j') uj();

else printf("Nincs ilyen parancs! Az sgt parancs megjeleniti a hasznalhato parancsokat.\n\n");

}}}}}}

}

}

2015. ápr. 5. 15:59
 4/5 anonim ***** válasza:

Először is mint láthatod az oldal kiszedi a behúzásokat, illene felrakni valami kódmegosztó oldalra ha azt szeretnéd hogy ránézzen valaki.


Másodszor pedig a változó és függvény elnevezéseid és a kódformázásod vetekszik egy obfuscált kódéval. Szokj rá hogy értelmes változó és függvényneveket adj meg, nem baj ha nem 1-2 betű hanem egész szó, vagy akár több szó.


Mikor először ránéztem azt hittem tényleg obfuscálva van és csak szívatsz minket. e c bn bn s bi p kls stb..


Harmadszor pedig sok hiba van benne, mondhatni rengeteg. Csoda hogy lefordult (ha egyáltalán lefordult). Több idő lenne felsorolni mindent mint átírni működőképesre a programot, de azért leírok párat:


-strcmp-vel hasonlítunk össze szöveget, 0 az eredmény ha megegyeznek.

-strcpy másol át szöveget más memória területre

-amit malloc-al lefoglalsz, szabadítsd is föl free-vel ha már nem használod, még kilépésnél is.

-scanf pointert vár 2. paraméternek, és a char szoveg[10] pedig egy pointer! Nem &szoveg kell a scanf-nek hanem simán szoveg. Számoknál jól csináltad. (erről elvileg kellett volna kapnod hibaüzenetet, de legalább egy figyelmeztetést! Olvasd el a hibaüzeneteket és javítsd őket, azért vannak ott mert valamit rosszul csinálsz)

-Ha számot olvasol be, a bufferben marad a sor végi enter, amit a következő beolvasásnál kapsz meg. Ha nem akarod hogy ott maradjon akkor mondjuk egy getchar()-al dobd ki a bufferből.

-Az akt és társai teljesen feleslegesen globális változók, csak az lista elejét kell ismerned amin végigiterálsz (fej).

-A láncold listádnak is voltak elvi hibái!


Nem sorolok fel mindent, javítottam a kódodon sok mindent, de nem próbáltam ki. Valószínűleg van még mit javítani. Nézd át és tanulj belőle:

[link]


Írd át, és használj értelmes függvény/változóneveket!

2015. ápr. 5. 19:58
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:
Kösz a példát, sokat segítettél :)
2015. ápr. 6. 13:28

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!