Sortierte Liste in C

Danke für die schnelle Antwort.

also jetzt geht es. Wieso verstehe ich zwar noch nicht so ganz :( aber es geht :D
Eine Frage habe ich aber noch. Wenn ich der Methode einen char *ptr übergebe geht es nur wenn ich in meiner main ein char string[] = "Kurt Kanns 555678 DE"; erstelle. Wieso geht es nicht so: char *k = "Kurt Kanns";?

list createListFromArray(char *array) <- so sieht der Methodenkopf aus wieso geht dann nicht das hier? char *k = "Kurt Kanns"
 
Ich nehme einmal an, dass Du einfach den Aufruf in der while Schleife angepasst hast und Du nicht mehr array sondern NULL übergeben hast.

Und der Link, den ich gegeben habe, erläutert es doch auch:
Beim ersten Aufruf muss strtok mit einem String initialisiert werden. Die Rückgabe ist hierbei der erste Abschnitt. Bei Folgeaufrufen wird statt string der NULL Wert übergeben, da strtok bereits initialisiert ist und intern einen Zeiger auf string gespeichert hat.
list createListFromArray(char *array) <- so sieht der Methodenkopf aus wieso geht dann nicht das hier? char *k = "Kurt Kanns"
Wieso sollte das nicht gehen? https://www.prismnet.com/~mcmahon/Notes/strings.html gibt das als Beispiel an, aber wir probieren es noch einmal:
test.c:
C:
#include <stdio.h>

void main() {
   char *k = "Kurt kanns";
   printf(k);
}
dann noch:
gcc -o test test.c
./test

Und schon steht da "Kurt kanns".
 
Bei mir geht das nicht. Er gibt dann mal wieder nichts mehr aus. Ich muss aufhören denn bin wieder total verwirrt :(

Also erst einmal hier die wie es bei mir aussieht. Vielleicht geht es bei dir ja :D
C:
    char string[] = "Kurt Kanns 555678 DE";
    char *k = "Kurt Kanns";
    list erg = createSentenceFromArray(string);
    printList(erg);
    printf("\n");
    list tmp = createSentenceFromArray(k);
    printList(tmp); //wird nicht gedruckt!!!
so sieht die Methode ja dazu aus:
C:
//list createSentenceFromArray(char *array) {
//    list erg = createEmptySentence();
//    char delimiter[] = " ";
//    char *ptr = NULL;
//    ptr = strtok(array,delimiter);
//    while(ptr != NULL) {
//        insertWordAtFront(&erg, ptr);
//        ptr = strtok(NULL,delimiter);
//    }
//    return erg;
//}
Denn ich habe eine weitere Methode dazu geschrieben um ein Array von node zu übergeben und diese node dann in meine Liste einzufügen.
Erstes Problem daran ich hab 20 Minuten gebraucht bis ich das node[] initialiserit bekommen habe. Wollte es per for Schleife machen doch das hat nicht geklappt :(
Zweites Problem wieso muss hier an der Stelle der Punkt hin?
C:
list createSentenceFromArray(node word[], int pos) {
    list erg = createEmptySentence(); int i;
    for(i = 0; i < pos; i++)
        insertWordAtEnd(&erg, word[i].value); //warum kommt hier der Punkt hin?

    return erg;
}
Ein Array ist doch nichts weiter als ein Pointer oder?
node *word sollte oben im Methodenkopf also auch funktionieren. Wieso muss man dann word.value schreiben hab es versucht so umzuschreiben das geht aber nicht! *(word+i)->value geht auch nicht so *(word+i).value!
Das hier hat mich mehr verwirrt als es mir etwas gebracht hat so ein misst aber auch :(

So habe ich es dann Initialisiert am Ende da ich nicht mehr weiter kam :(
C:
node a[2];
    node test = {"Test", NULL, NULL};
    node test2 = {"Test2", NULL, NULL};
    a[0] = test;
    a[1] = test2;
    list t = createSentenceFromArray(a, 2);
    printList(t);
 
Zugriff auf Elemente:
a) wenn du einen Pointer hast, also z.B. node *pnNode: pnNode->element
b) wenn du eine instanz hast: node nNode: nNode.element
Also bei pointer -> und bei instanz .

Bezüglich der Ausgabe:
Hast du es wieder aus eclipse gestartet? Mach es dann direkt von der Kommandozeile! Oder besorg Dir eine andere IDE, wenn eclipse so spinnt.
 
a) wenn du einen Pointer hast, also z.B. node *pnNode: pnNode->element
b) wenn du eine instanz hast: node nNode: nNode.element
Ja das ist mir irgendwie klar :)
Doch ein Array ist doch eigentlich auch ein Pointer deswegen dachte ich dort muss auch der -> hin :)

Hast du es wieder aus eclipse gestartet? Mach es dann direkt von der Kommandozeile! Oder besorg Dir eine andere IDE, wenn eclipse so spinnt.
Ja hab es wieder wie alles aus Eclipse gestartet. Dann sollte ich das mal ausprobieren ohne Eclipse.

Danke nochmals

Achso weisst du wie ich mein node word[] besser initialisieren kann?

LG
 
Ja das ist mir irgendwie klar :)
Doch ein Array ist doch eigentlich auch ein Pointer deswegen dachte ich dort muss auch der -> hin :)
Also word ist das Array und damit wäre es ein Pointer. Das word[i] ist dann aber ein konkretes Element. Also der Pointer aufgelöst. Das word[i] ist nichts anderes als ein *(word+i), was dann ja zeigt: Das ist nicht mehr der Pointer sondern das Element.

Und auf das (word+i) noch einmal zurück kommen:
word ist ein pointer auf das erste Element eines Arrays.
(word+i) ist ein Zeiger auf das ite Element des Arrays.
Nun kannst Du auf Elemente zugreifen. Bei einem Pointer wäre dies dann z.B. (word+i)->value
Wenn Du einen Pointer hast, dann kannst Du mit * das Element dahinter bekommen, also ist *(word+i) das Element des Arrays.
Wenn Du da nun .value anhängen willst, dann geht das nicht *(word+i).value ist für den Compiler *((word+i).value), d.h. er würde da den Pointer nehmen und Zugriff als Element -> Das wird nichts. Aber wir können da natürlich Klammern setzen:
(*(word+i)).value.
Aber das ist natürlich Quatsch - da nutzt man natürlich entweder word.value oder von mir aus noch (word+i)->value, was ich aber unleserlich finde.

Ja hab es wieder wie alles aus Eclipse gestartet. Dann sollte ich das mal ausprobieren ohne Eclipse.
Ich habe keine Ahnung, was da mit Deinem Eclipse los ist, aber ich habe Eclipse auch noch nie mit C oder C++ genutzt. Da hatte ich damals unter Windows Visual Studio und unter Linux KDevelop oder Anjuta im Einsatz. Aber es gibt auch noch einige andere IDEs, die gerade für Anfänger gut sein könnten, da sie nicht so überladen sind. CodeBlocks fällt mir da z.B. gerade ein....

Achso weisst du wie ich mein node word[] besser initialisieren kann?
Wie initialisierst Du das derzeit? Ich habe gerade keinen wirklichen Überblick, was Du da wie machst. Ich habe aber da mal noch paar Aussagen / Fragen von Dir aufgearbeitet, auf die ich vorher noch nicht eingegangen bin.
 
Also word ist das Array und damit wäre es ein Pointer. Das word[i] ist dann aber ein konkretes Element. Also der Pointer aufgelöst. Das word[i] ist nichts anderes als ein *(word+i), was dann ja zeigt: Das ist nicht mehr der Pointer sondern das Element.
Stimmt deswegen auch der . :)

Was mit meinem Eclipse dann los ist weis ich auch nicht. Vielleicht sollte ich die Programme öfters dann über die Konsole laufen lassen.

Derzeit Initialisierie ich das node word[] so:
in meiner main:
C:
node a[2];
    node test = {"Test", NULL, NULL};
    node test2 = {"Test2", NULL, NULL};
    a[0] = test;
    a[1] = test2;
    list t = createSentenceFromArray(a, 2);
    printList(t);
Mein Node sieht so aus:
C:
typedef struct word {
    char value[WORD_SIZE];
    struct word *next;
    struct word *prev;
}node;
Ich wollte es in einer Schleife Initialisieren geht das Überhaut in C?

Danke.
 
Also bezüglich des Initialisierens habe ich noch immer Probleme, Dich so richtig zu verstehen, aber das liegt evtl. daran, dass ich derzeit nicht den Überblick habe, was Du erreichen möchtest....

Aber natürlich kann man auch in C ein Array in einer Schleife initialisieren. (Generell geht alles, was in Java und Co geht, auch in C/C++. Aber natürlich ist dies ggf. etwas umständlicher. Aber Java ist ja auch irgendwie entwickelt worden und das was Java Compiler und JVM machen, geht natürlich auch in C ... Egal wie Du etwas schreibst: Am Ende ist es der Computer der irgendwas macht ... Aber das heißt natürlich nicht, dass etwas einfach ist ... )

Also ein Beispiel, wie ein node Array in einer Schleife initialisiert wird:
C:
#include <stdio.h>
 
typedef struct Node {
    char value[100];
    struct Node *next;
    struct Node *prev;
}node;

void main() {
        node array[10];

        for (int i=0; i<10; i++) {
                sprintf(array[i].value, "Element %d", i);
                array[i].next = NULL;
                array[i].prev = NULL;
        }
}
Also Node ist klein bisschen geändert - statt deiner Constante habe ich eine Magic Number ... hab beim Copy & Paste nicht aufgepasst und dann zu faul, erneut zum Browser zu wechseln ...
 
Eine Frage habe ich aber noch. Wenn ich der Methode einen char *ptr übergebe geht es nur wenn ich in meiner main ein char string[] = "Kurt Kanns 555678 DE"; erstelle. Wieso geht es nicht so: char *k = "Kurt Kanns";?
Erstmal sind
C:
char string[] = "ABCD";
char *k = "ABCD";
zwei unterschiedliche Dinge.

Im ersten Fall erzeugst Du ein Array, das mit den Zeichen aus dem Literal (inkl. der abschließenden 0) initialisiert wird. Im zweiten Fall erzeugst Du einen Zeiger auf ein Literal.

Das Verhalten beim Versuch, ein Literal zu verändern, ist nicht definiert. Der GCC legt das Literal in ein Read-Only-Segment ab, so dass Versuche, das Literal zu verändern, mit einem Speicherzugriffsfehler quittiert werden.

Zur Veranschaulichung:
C:
#include <stdio.h>

int main(int argc, char *argv[]) {
    char string[] = "ABCD";
    char *k = "ABCD";
    char *m = "ABCD";

    printf("%p\n%p\n%p\n", string, k, m);
    return 0;
}
Wenn Du das mit dem GCC übersetzt, wirst Du vermutlich feststellen, dass k und m auf die gleiche Adresse zeigen. Das Literal wird also nur einmal für die beiden Zeiger abgelegt. Jetzt wäre es ziemlich ungünstig, wenn Du über m das Literal ändern könntest, denn dann würde sich automatisch auch k verändern. Insofern macht es durchaus Sinn, dass der Compiler für Literale ein RO-Segment verwendet.

Da strtok die übergebene Zeichenkette verändert, muss die Angabe eines Zeigers auf ein Literal zu einem Speicherzugriffsfehler führen.
 
Nochmals Danke an euch beide :)
Muss mir die Strings, Arrays und Pointer noch einmal anschauen. Bei der ganzen Sache jetzt habe ich mich wieder total verwirrt :(

Des weiteren war ich wohl etwas vorlaut das ich Bäume rekursiv hin bekomme :( grr.... ich dachte ich hätte es verstanden :'(
 
Evtl. einmal den Link von mir ansehen? Der zeigt das alles recht anschaulich finde ich... Und dann evtl. daran etwas entlang hangeln? Ich habe im Augenblick keinen Ansatz, wo wir für Verwirrung gesorgt haben ....

Ansonsten kann ich dir ggf. auch einmal ein direktes Gespräch anbieten. Das hilft evtl. mehr wie schreiben....
 
? Ich habe im Augenblick keinen Ansatz, wo wir für Verwirrung gesorgt haben ....
o_O Ohhh.. nicht falsch verstehen. Ihr habt euch ja super nette Mühe gegeben :) Das ganze liegt an mir!

Bin ja schon einmal froh das wenigstens die paar Listen Algorithmen nun laufen :) Der Rest ist erst einmal neben Sache.

Ich hätte aber noch ein kleines Problem aber zum Thema Suchbaum. Soll ich ein neues Thema erstellen da es hier ja um die Liste geht und falls jemand auch so ein Problem hat es auch finden kann?
Wollte bei einem Suchbaum eine Methode schreiben die mir den Vaterknoten sucht für den Wert den ich gerne einfügen möchte. Doch irgendwie klappt es Rekursiv mal wieder überhaupt nicht :( bzw. hab es sogar wieder komplett gelöscht.
Es ist echt zum Haare raufen.
 
Passende Stellenanzeigen aus deiner Region:

Oben