Ring als struct



  • Hallo zusammen,

    kann mir jemand erklaeren wie ich in einem Verbund (struct) einen Ring darstelle, der einen Index, Folgeindex und als Wert eine Zufallszahl hat. Nach einer n-Anzahl von Elementen soll das letzte Element wieder auf das erste Element zeigen. (Deshalb ein Ring).





  • Du kannst eine Struct item anlegen:

    struct item {
        item *next;
        item *last;
        int value;
    };
    

    und dann eine Art Bandgerät programmieren..

    /* ein item anlegen */
    item *createItem(int value) {
      item *it = (item*) malloc (sizeof(item));
      it->next = it;
      it->last = it;
      it->value = value;
      return it;
    }
    
    /* ein item hinzufügen */
    void addItem (item *ring, item *it) { 
       /* nachfolger verlinken */
       it->next = ring->next;
       it->next->last = it;
    
       /* vorgänger verlinken */
       it->last = ring;
       ring->next = it;
    }
    
    item *getNext (item * ring) {
      return item->next;
    }
    
    item *getLast (item * ring) {
      return item->last;
    }
    
    int main () {
      int i;
      /* ring initialisierne */
      item *meinring = createItem(0);
    
      /* ring befüllen */
      for (i = 1; i < 10; i++ ) {
         addItem (meinring, createItem(i));
      }
    
      /* ToDo: ring löschen */
    
      return 0;
    }
    

    eigentlich nicht soo schwer 😉



  • wenn man nur einen wert hat geht auch ein einfaches array:

    #define RINGSIZE 4
    
    int get_random_from_ring (void)
    {
       static int idx = -1;
       static int numbers[RINGSIZE];
       int s;
    
       if (idx == -1)
       {
          srand (time(0));
          for (s=0; s<RINGSIZE; s++)
             numbers[s] = rand();
          idx = 0;   
       }
    
       if (idx == RINGSIZE)
          idx = 0;
    
       return numbers[idx++];
    }
    


  • Dank euch schon mal, hab noch vergessen zu erwähnen, dass der Datentyp zeigerlos sein soll. Ich brauch also im Endeffekt "nur" einen Datentyp der all diese Eigenschaften aufweist. Also ein Verbund (struct) aus Index, Wert(Zufallszahl), Folgeindex auf das naechste Ringelement (wobei das letzte dann wieder auf das erste Element "zeigt". Das alles in ein struct zu packen, erzeugt einen Knoten in meinem Hirn.



  • Wenn du Indizes verwendest, benötigst du auch ein Array, das du damit indizieren kannst:

    typedef struct
    {
      int value;
      int next;
    } element;
    
    element data[SIZE];
    

    Dann kannst du mit den Indizes (fast) genauso hantieren wie mit Zeigern (data[i] ist das i-te Element, data[el.next] ist der Nachfolger des Elements el).



  • Und wie zeig ich dann wieder auf das Anfangselement?



  • Indem du im letzten Element den next-Index mit 0 belegst (data[0] ist das erste Element des Arrays).

    (nur aus Neugierde: Ist das eine Übungs/Praktikums/...-Aufgabe oder testest du nur die Möglichkeiten von C aus?)



  • Ist eine Aufgabe mit der ich mich jetzt schon seit einiger Zeit herumquäle, ich versuch mal mein Glück. Danke für die Hinweise!


Anmelden zum Antworten