Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.12.2006, 12:39

Listenproblem in C

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Sortieren

// Simon Klausner, Manuel Unterberger, Maximilian Gerhardt, Manuel Willard

// purpose :  - define list

//            - define list functions (add, find, delete)



#include <stdio.h>

// Struct List

struct List
{
   int iNumber;         // number

   char cChar;          // character

   struct List *next;   // pointer on the next element of the list

}; 

void CreateElement(int iNumber, char cChar, struct List **base);  // Creates Element in list

void DeleteElement(int iNumber, struct List **base);              // Deletes Element

void Output(struct List *base);                                   // Output function


// main function

// purpose :  - Create a list

//            - Call all functions

int main ()
{
  // Variables

  struct List *base=NULL; // pointer on the first element of the list

  
  CreateElement(8, 'h', &base);
  DeleteElement(8, &base);
  Output(base);
  return 0;
} // end main




// Create Element

// purpose : - create a element in the list

void CreateElement(int iNumber, char cChar, struct List **base)
{
  // Variables

  struct List *ptr=NULL;
  ptr = *base;
  
  if (ptr == NULL)
  {
    // Create first element of list

    ptr = (struct List *) malloc(sizeof(struct List));
    *base = ptr;
  }
  else
  {
    // Create more elements

    // Search end of list

    while (ptr->next != NULL) ptr = ptr->next;

    // Create new element

    ptr->next = (struct List*) malloc(sizeof(struct List));
    ptr = ptr->next;
  }
  
  ptr->iNumber = iNumber;
  ptr->cChar = cChar;
  ptr->next = NULL;
} // end Create Element




// Delete Element

// purpose : - delete element in the list

void DeleteElement(int iNumber, struct List **base)
{
   struct List *ptr=NULL, *ptrNext=NULL;

   assert(*base != NULL);
   if ((*base)->iNumber == iNumber)
   {
    // First element of list will be removed

    ptr = (*base)->next;
    free(*base);
    *base = ptr;
   }
   else
   {
      ptr = *base;
      // Search for elements which will be deleted

      while (ptr->next != NULL)
      {
        ptrNext = ptr->next;
        if (ptrNext->iNumber == iNumber)
        {
          // Found!


          // next of predecessor points on successor

          ptr->next = ptrNext->next;

          // Delete searching element

          free(ptrNext);
          break;
        }
        ptr = ptrNext;  // if not found yet

      }
   }
} // end Delete Element




// Output function

// purpose : - prints the elements of the list

void Output(struct List *base)
{
  struct List *ptr=NULL;

  ptr = base;
  while (ptr != NULL)
  {
    printf("\n\nZahl: %d", ptr->iNumber);
    printf("\nBuchstabe: %c", ptr->cChar);
    ptr = ptr->next;
  }
} // end Output


hi leute,also ich bräucht das für die uni wo wir leider noch c lernen und c++ VERBOTEN IST!

somit müssen wir diese listen serlber schreiben :(

kann mir wer verraten warum der code oben nicht funktioniert?

bei mir kommt da ein assert fehler :

Zitat

undefined refference to assert : in function DeleteElement[\quote]

und die printfunktion liefter,wenn ich das assert auskommentiere gar nix (vermutlich,weil es eben das assert brauch).

kann mir wer ne funktionierende lösung posten oder mir erklären, warum da ein fehler auftritt?

mfg
Drac
[/code]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

07.12.2006, 12:55

Das die printf nichts ausgibt liegt evtl daran das du den Eintrag sofort wieder löschst. Ansonsten funktionierts bei mir durchaus.
@D13_Dreinig

3

07.12.2006, 13:14

lol du hast den assert fehler also nicht?

was geht? oO :)

edit: hm ja wenn ich assert auskommentiere funktionierts dann doch :)

jetzt müsste ich die liste noch umdrehen also dass das ende am anfang steht und der anfang am ende.

hat wer ne idee, wie sowas kurz gehen könnte? ich komm nur auf komplizierte lösungen :(

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

08.12.2006, 14:02

Du könntest einen Stack in Form eines Arrays heranziehen und der Reihe nach die Elemente der Liste "drauf-pushen". Die Liste löst Du komplett auf und baust Sie auf Basis der Stack-Elemente wieder auf, indem Du sie einzeln "herunter-popst". Die Reihenfolge der Elemente ist dabei automatisch umgedreht worden.
Wie groß das Array sein muss, ist trivial: Es muss halt genau die Anzahl Elemente der Liste unterbringen können.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

5

08.12.2006, 15:17

Füge ein

C-/C++-Quelltext

1
#include <assert.h>

hinzu
"Games are algorithmic entertainment."

6

11.12.2006, 10:14

Zitat von »"Draculark"«

lol du hast den assert fehler also nicht?

was geht? oO :)

edit: hm ja wenn ich assert auskommentiere funktionierts dann doch :)

jetzt müsste ich die liste noch umdrehen also dass das ende am anfang steht und der anfang am ende.

hat wer ne idee, wie sowas kurz gehen könnte? ich komm nur auf komplizierte lösungen :(


Du musst nur die ganze Liste einmal durchgehen und bei jedem Element einfach den Pointer umdrehen.
Pseudocode:

Quellcode

1
2
3
4
5
Merker=NULL
for i=Erstes_Element to Letztes_Element
  i.pointer=Merker
  Merker=i
next i

fertisch :-)

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

7

11.12.2006, 10:38

Für ein komplettes umkehren fehlt dann aber noch:

Quellcode

1
2
3
merker = first;
first = last;
last = merker;

;)

Werbeanzeige