Forum: PC-Programmierung "C" Verketette Listen


von feldi (Gast)


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

von Martin (Gast)


Lesenswert?

feldi schrieb:
> Worin liegt der Unterschied zweischen strlen und malloc

Kiffst du?

von 42 (Gast)


Lesenswert?

Martin schrieb:
> feldi schrieb:
>> Worin liegt der Unterschied zweischen strlen und malloc
>
> Kiffst du?

Soll heißen: strlen ermittelt die Länge eines Strings, malloc reserviert 
Speicher, die beiden haben nichts miteinander zu tun.

Das übliche Spiel: Stelle präzise Fragen und geb alle nötigen Infos und 
du erhälst brauchbare Antworten. Oder kurz: Netiquette

von U.R. Schmitt (Gast)


Lesenswert?

feldi schrieb:
> Worin liegt der Unterschied zweischen strlen und malloc (ist der
> unterschied nur dass bei strlen die abschließende Null nicht mitgezählt
> wird?)
Hast du schon mal in ein C Buch geschaut was die Funtionen TUN?

von feldi (Gast)


Lesenswert?

Martin schrieb:
> Kiffst du?


Nein!!da liegt wohl das Problem

von Mario Barth (Gast)


Lesenswert?

>Kiffst du?

Den Kommentar find ich geil... :-D

von Mario Barth (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??

von Peter II (Gast)


Lesenswert?

man sollte auch speicher wieder Freigeben - auch wenn es bei diesen 
Programm ohne geht sollte man sich das gar nicht erst angewöhnen.

Oder für diesen zweck besser _alloca

von Mario Barth (Gast)


Lesenswert?

Peter II schrieb:
> Oder für diesen zweck besser _alloca

Oder passend zum Wochenende:
la_vida_loca

:-D

von feldi (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

von Uwe .. (uwegw)


Lesenswert?

sizeof() wird auf einfache Datentypen angewandt und gibt zurück, wie 
viele Bytes diese im Speicher belegen.
strlen() wird auf "strings" angewandt, und gibt zurück aus wie vielen 
Zeichen (ohne \0) diese bestehen.

von Stefan E. (sternst)


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

von feldi (Gast)


Lesenswert?

Hallo

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"

Gruß feldi

von Stefan E. (sternst)


Lesenswert?

feldi schrieb:
> Stimmt die obrige Aussage?

Nein.

feldi schrieb:
> Ich war der Meinung
> lSize = strlen(bez3)+1; //zeichenänge ohne \0 von (bez3) in diesem Fall
> von "sepp"

Nein, mit '\0', dafür ist das +1 da.

von feldi (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

von Stefan E. (sternst)


Lesenswert?

feldi schrieb:
> sondern es wird die Zeichenlänge ermittelt!

Nö, die Zeichenlänge (Länge eines Zeichens) ist immer 1. ;-)
Es wird die Stringlänge (Länge des Strings in Zeichen) ermittelt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.