Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
C - Listen [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
C - Listen


 
Jessy_87
01-06-2010, 09:59 
 
Wahrscheinlich ist mein Problem recht trivial, aber irgendwie bekomm ich es einfach nicht hin, die Listenelemente über eine Zählvariable auszugeben.

Die Funktion sieht folgendermaßen aus:


void ausgabe(struct element *start){
int j=0; //Iterationsvariable

if(start != NULL){
printf("%d. %s\n", j++, start->zeichenkette);
ausgabe(start->next);
}
}

hierbei werden leider alle eingaben mit der gleichen iterationsvariablen ausgegeben....
wenn ich eine while-schleife nutze, wird aber daraus ne endlosschleife...:dontknow:

done...

to be continued :teach:

Wäre es möglich, wenn mal eben jemand über den Quellcode schaut?

Also ich soll Zeichenketten zeilenweise über stdin einlesen und in dynamisch angeforderte Speicherbereiche übertragen (ans aktuelle Ende der verketteten Liste).
Folgende Struktur soll verwendet werden:


struct element {
struct element *next;
char *zeichenkette;
};
Die Listenelemente sind ebenfalls durch dyn. Speicheranforderung bereitzustellen. Nach Eingabe sollen die Zeichenketten nummeriert ausgegeben werden und vor Beendigung des Proggs sollen alle Speicherbereiche wieder freigegeben werden.


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

#define MAXSTR_L 60


//Knotendefinition
struct element{
char *zeichenkette; //Speicherzelle
struct element *next; //naechstes Kettenglied
};
int j = 0;
int i = 1;

//Prototypen
struct element *einfuegen(char *puffer);
void ausgabe(struct element *start);
void leeren(struct element *plauf);


int main (int argc, char ** argv){

struct element *start = NULL, *ende = NULL;
char *puffer = (char*)malloc(MAXSTR_L*sizeof(char));

while(fgets(puffer, MAXSTR_L, stdin) != NULL){
puffer[strlen(puffer)-1] = '\0';
j++; //Zähle jeden Eintrag
if(start == NULL){
start = einfuegen(puffer);
ende = start;
}else{
ende -> next = einfuegen(puffer);
ende = ende -> next;
}
}
ausgabe(start);
leeren(start);
system("PAUSE");
return 0;

}


struct element *einfuegen(char *puffer){ //unsortiert
struct element *tmp = (struct element* ) malloc( sizeof(struct element));
tmp -> zeichenkette = (char*)malloc(strlen(puffer)+1);
strcpy(tmp -> zeichenkette, puffer);
tmp -> next = NULL;
return tmp;
}

void ausgabe(struct element *start){
if(start != NULL){
while (i<=j){
printf("%d. %s\n", i, start->zeichenkette);
i++;
ausgabe(start->next);
}
}
}

void leeren(struct element *start){

while(start != NULL){
free(start -> zeichenkette);
leeren(start -> next);
}
free(start);
}
über gute ratschläge und tipps würde ich mich sehr freuen...

 
unset
01-06-2010, 12:27 
 
Mein erster Ratschlag ist, dass du den Edit-Button benutzt!

 
Jessy_87
01-06-2010, 13:58 
 
sorry @ unset ;)
aber nun hätte ich doch ne frage.

ich soll in der liste nach zeichenketten suchen und diese ausegeben, die über die als kommandozeilenargument übergeben wurden

ich bin mir nicht sicher, ob ich das richtig verstehe. folgenden weg würde ich einschlagen??!


void suche(char ** argv, struct element *start){

if(start != NULL){

do{
if(strstr(start -> zeichenkette, argv) != NULL){
puts(start -> zeichenkette);
}
start = start -> next;
}while(start -> next != NULL);
}
}

 
jmc
06-06-2010, 01:07 
 
Ich habs nur kurz überflogen, aber eigentlich solltest du da doch z.T. auch Fehler bekommen oder nicht?
Zur allerersten Frage: j ist eine lokale Variable, die du als 0 initialisiert und danach jeweils um eins erhöht wird (jedes Mal!)
Zum letzten Beitrag:
strstr erwartet einen Pointer zu char dü übergibst aber einen Pointer zu einem Pointer siehe deine eigene Funktionsdeklaration: char ** argv, struct element *start.
Wenn du eine konkrete Frage hast dann schreib doch einfach wieder, aber jemanden, der dir alles einfach durchschaut und nach Gutdünken abändert wirst du wahrscheinlich nicht finden.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:43 Uhr.