Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋼) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Verkettete Liste & Speicher

Empfohlene Antworten

Veröffentlicht

Hi ! Bin neu hier und hab auch gleich mal ne frage !

Hab ein Problem bei einem Projekt wo wir eine Verkettete Liste erstellen sollen

Die Liste ansich ist nicht wirklich mein Problem. Eher das die Liste "allgemein" sein soll. Also vom "inhalts"-Typen unabhÀngig.

Die liste kann also int, strings als auch structs "verarbeiten", bzw mit den gleichen funktionen hinzufĂŒgen usw.

Hier mal kurz die liste


typedef struct Knoten

	{

		struct Knoten* next ;

		void* content ;

	} Knoten ;


typedef struct Liste

	{

		Knoten* first ;

                Knoten* last ;

		int     size ;

	} Liste ;


void printList(Liste* l, void (*printContent) (void*)) ;

void appand(Liste* l, void* value) ;


und hier die Funktionen der liste

#include <stdio.h>

#include <stdlib.h>

#include "Listen.h"



void printList(Liste* l, void (*printContent) (void*))

{

	Knoten* k = l->first ;

	while (k!=NULL)

	{

		printContent(k->content) ;

		k = k->next ;

	}

}


void appand(Liste* l, void* value)

{

        Knoten* neu = (Knoten*) malloc(sizeof(Knoten)) ;

	if (neu == NULL)

	{

		printf("Kein Arbeitsspeicher mehr vorhanden!\n") ;

		exit(EXIT_FAILURE) ;

	} ;

	(*neu).next = NULL ;




        neu->content = value ;

        if (l->size == 0)

	{

		l->first = neu ;

	}

	else

	{

		Knoten* letzterKnoten = l->last ;

		letzterKnoten->next = neu ;


	} ;

        l->last = neu ;


	l->size++ ; // Anzahl der Knoten in der Liste um 1 erhöhen.

}


Das ganze funktioert auch !

Nun sollen Daten aus einer Textdatei eingelesen werden, und in die liste hinzugefĂŒgt werden.

Das ganze klappt bei mir nur, wenn meine Textdatei genau eine Zeile hat. Bei zwei zeilen wird die erste ĂŒberschrieben, und recht abgehackt ausgegeben!

Grund, meine "eingelesenen" wörter (mit fgets aus der txt datei eingelesen & mit strtok in einzelne wörter zerteilt) gammeln irgendwo im speicher ohne das speicher reserviert wurde. Soweit sogut.

Aber WO soll ich denn speicher reservieren, wenn die liste fĂŒr den speicher selbst verantwortlich sein soll ?

Sobald ich bei appand anfange speicher fĂŒr "strings" zu reservieren (mal abgesehen davon, dass ich das nichtmal hinbekommen habe bisher), wird das ganze doch wieder auf strings "begrenzt".

gibt es eine möglichkeit heraus zu bekommen, welcher typ an "appand" ĂŒbergeben wurde und dann mit ner if anweisung fĂŒr den entsprechenden typ speicher zu reservieren ?

Hoffe ich habe mein Problem halbwegs verstĂ€ndlich rĂŒbergebracht. Ist fĂŒr die Uni, und ich hab mal wieder viel zu spĂ€t angefangen mich damit zu beschĂ€ftigen ... Und damit der lerneffekt erhalten bleibt, bin ich ĂŒber tips / hinweise dankbarer als ĂŒber vorgefertigte lösungen ;) (halb gelogen aber egal ;P )

Aber WO soll ich denn speicher reservieren, wenn die liste fĂŒr den speicher selbst verantwortlich sein soll ?
Wer sagt denn, dass sie das soll?

gibt es eine möglichkeit heraus zu bekommen, welcher typ an "appand" ĂŒbergeben wurde und dann mit ner if anweisung fĂŒr den entsprechenden typ speicher zu reservieren ?
Selbst wenn das möglich wĂ€re: Dadurch, dass man durch Structs beliebig neue Typen definieren kann, mĂŒsstest du eine unendlich große If-Kaskade bauen.

Du könntest zusĂ€tzlich die GrĂ¶ĂŸe des Wertes ĂŒbergeben, ein entsprechend großes char-Array bereitstellen und umkopieren. Dann mĂŒsste der Benutzer der Liste aber beim Zugriff auf die gespeicherten Elemente wieder in ein Objekt des passenden Typs umkopieren, weil nicht garantiert ist, dass ein char-Array fĂŒr einen beliebigen anderen Typ passend ausgerichtet ist - Stichwort Alignment.

Und selbst das klappt nicht, wenn die Elemente selbst Strukturen sind, die wiederum Zeiger auf Speicher enthalten, der wer weiß wo verwaltet wird. Was machst du denn, wenn bei der Typanalyse rauskommt, dass value ein Zeiger auf

struct xyz
{
unsigned long* data_array;
unsigned char* not_zero_terminated;
struct xyz* next;
};[/CODE]

ist?

In C kann eine generische Liste nicht den Speicher ihrer Elemente verwalten. Das bleibt Aufgabe des Benutzers.

In C kann eine generische Liste nicht den Speicher ihrer Elemente verwalten. Das bleibt Aufgabe des Benutzers.

Vielleicht etwas praktischer formuliert:

Die Liste ist ein Konstruktur aus einem Zeiger, der auf das aktuelle Element zeigt und ein solches Element besteht aus einem Zeiger auf die Daten und einem Zeiger auf das nÀchste Element.

Z.B. kann der Benutzer dann ints, chars oder beliebige andere Strukturen erzeugen und ĂŒbergibt der Liste beim hinzufĂŒgen eines Elementes nur den Zeiger auf dieses Element. Das Abfragen eines Elementes, liefert dann nicht das Element, sondern nur den Zeiger darauf

Phil

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.