"C" Verketette Listen

Gast #2146637
Lesenswert?
• ▲
▼
Hallo zusammen könnte mir jemand durch kommentare zum Teil 1.4 erklären 
was da passiert?

Worin liegt der Unterschied zweischen strlen und malloc (ist der 
unterschied nur dass bei strlen die abschließende Null nicht mitgezählt 
wird?)


Gruß feldi
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4

5
//------------------------------------------------------------------------------
6

7
//1.1 struct als globaler Datentyp
8
struct ListElm {int Prio; char *name; struct ListElm *next;};                 
9
                                                                                
10
//------------------------------------------------------------------------------
11

12
//1.3 Ausgabe eines Elements mit Unterprogramm
13
void PrintElm(struct ListElm *z)                                                
14
{
15
    printf("-----------------------------------------------------------------");
16
    printf("\nPrioritaet: %d", z->Prio);
17
    printf("\nName: %s", z->name); 
18
    printf("\nVerkettungsinfo: %x\n\n", z->next);
19
}
20

21
//------------------------------------------------------------------------------
22

23
//1.6 Ausgabe der Liste mit Unterprogramm
24
void PrintList(struct ListElm *Tail)                                      
25
{
26
     while (Tail != NULL)
27
     {
28
      PrintElm(Tail);
29
      Tail = Tail->next;
30
      }
31
      
32
}
33

34

35

36
//______________________________________________________________________________
37
//_____________________________main programm____________________________________
38
//______________________________________________________________________________
39

40

41

42

43
int main(int argc, char *argv[])
44
{
45
    struct ListElm a = {8, "Hase", NULL};
46
    struct ListElm *Wurzel, *Hilfe;
47
    char bez1[] = "Flo", bez2[] = "Hans", bez3[] = "Sepp";
48
    
49
    int lSize;
50
    
51
    
52
                                                                                
53
    //1.2 Ausgabe eines Elements im Programm
54

55
    printf("Groese in Byte: %d ", sizeof (a));                 
56
    printf("\nPrioritaet: %d", a.Prio);
57
    printf("\nName: %s", a.name); 
58
    printf("\nVerkettungsinfo: %x\n\n", a.next);
59
    
60
    
61
                                                                                
62
    //1.3 Ausgabe eines Elements mit Unterprogramm
63

64
    PrintElm(&a);    
65
    
66
    system("pause");
67
    system("cls");                                                           
68
    
69
    
70
    
71
    //1.4 Erzeugen eines Elements durch malloc mit anschließender Ausgabe
72
    
73
    lSize = sizeof(struct ListElm);          
74
    Wurzel = (struct ListElm *) malloc(lSize);                                 
75
    
76
    Wurzel->Prio = 7;
77
    
78
    lSize = strlen(bez3)+1;
79
    Wurzel->name=(char *) malloc(lSize);
80
    strcpy(Wurzel->name,bez3);
81
    
82
    Wurzel->next = NULL;
83
    
84
    PrintElm(Wurzel);
85
    
86
    system("Pause");
87
    system("cls");
88
    
89
    
90
    
91
    //1.5 Element vorne anhängen
92
    
93
    lSize = sizeof(struct ListElm);         
94
    Hilfe = (struct ListElm *) malloc(lSize);                                 
95
    
96
    Hilfe->Prio = 3;
97
    
98
    lSize = strlen(bez2)+1;
99
    Hilfe->name=(char *) malloc(lSize);
100
    strcpy(Hilfe->name,bez1);
101
    
102
    Hilfe->next = Wurzel;
103
    
104
    Wurzel   = Hilfe;
105

106

107
    PrintElm(Wurzel);
108
    PrintElm(Wurzel->next);
109
    
110

111
    
112
    //6. Ausgabe der Liste mit Unterprogramm 
113
    
114
    PrintList(Wurzel);
115
    
116
    system("Pause");
117
    system("cls");
118
  
119

120
    
121
    //7. Neues Element an zweiter Stelle einfügen
122
    
123
    lSize = sizeof(struct ListElm);         
124
    Hilfe = (struct ListElm *) malloc(lSize);                                 
125
    
126
    Hilfe->Prio = 2;
127
    
128
    lSize = strlen(bez2)+1;
129
    Hilfe->name=(char *) malloc(lSize);
130
    strcpy(Hilfe->name,bez2);
131
    
132
    Hilfe->next = Wurzel->next;
133
    Wurzel->next = Hilfe;
134
    
135
    
136
    PrintList(Wurzel);
137
        
138
  
139
  system("PAUSE");  
140
  return 0;
141
}
142
C-Code
Gast
Lesenswert?
• ▲
▼
1
lSize = sizeof(struct ListElm); //Bestimmen der Datengröße      
2
    Wurzel = (struct ListElm *) malloc(lSize); //Allokieren von neuem Speicher und zuweisen des Pointers                                
3
    
4
    Wurzel->Prio = 7; //Prio= 7 eintragen ?? Was das auch immer bedeutet
5
    
6
    lSize = strlen(bez3)+1; //Datengröße von "Sepp" bestimmen + '\n'
7
    Wurzel->name=(char *) malloc(lSize); //Allokieren von Speicher und zuweisen des Pointers
8
    strcpy(Wurzel->name,bez3); //Kopieren von "Sepp" in den soeben allokierten Speicher
9
    
10
    Wurzel->next = NULL; //Keine nachfolgenden Elemente
11
    
12
    PrintElm(Wurzel); //??Ausgabe der Datenstruktur??
13
    
14
    system("Pause");// ??Pause??
15
    system("cls"); //??Bildschirm löschen??
Gast
Lesenswert?
• ▲
▼
Sorry
> Worin liegt der Unterschied zweischen strlen und malloc (ist der
> unterschied nur dass bei strlen die abschließende Null nicht mitgezählt
> wird?)

hatte mich in meiner frage verschreiben(kommt davon wenn amn zwei sachen 
gleichzeitig macht:-()

Wollte fragen:

Worin liegt der Unterschied zweischen strlen und sizeof (ist der
unterschied nur dass bei strlen die Abschließende Null nicht mitgezählt
wird?)

Gruß feldi
Lesenswert?
• ▲
▼
feldi schrieb:
> Worin liegt der Unterschied zweischen strlen und sizeof (ist der
> unterschied nur dass bei strlen die Abschließende Null nicht mitgezählt
> wird?)

Diese Frage ist beinahe ebenso sinnlos, wie die ursprüngliche.
strlen und sizeof sind zwei verschiedene Dinge:
1
char *a = "Hallo";
2

3
strlen(a) -> 5
4
sizeof(a) -> 2, oder 4, oder 8, (je nach dem wie groß ein Pointer auf dem Zielsystem ist)
5

6
char b[100] = "Hallo";
7

8
strlen(b) -> 5
9
sizeof(b) -> 100
Gast
Lesenswert?
• ▲
▼
Danke!
feldi schrieb:
> Mario Barth schrieb:
>
>> lSize = strlen(bez3)+1; //Datengröße von "Sepp" bestimmen + '\n'
>
>
>
> Stimmt die obrige Aussage?
>
> Ich war der Meinung
>
> lSize = strlen(bez3)+1; //zeichenänge ohne \0 von (bez3) in diesem Fall
>
> von "sepp"

Stefan Ernst schrieb:
> Nein, mit '\0', dafür ist das +1 da.


ja gut das dass +1 dafür da ist; ist klar(war gerade mein Fehler)

Aber das die DATENGRÖßE von "SEPP" ermittelt wird stimmt doch nicht 
sondern es wird die Zeichenlänge ermittelt!

Richtig?


Gruß feldi

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.