Listen ( Achtung: Schwer! :D )



  • Hallo Ihr Lieben

    Probleme bei loadlist Funktion
    kann sich irgendjemand geschultes mal kurz der Aufgabe widmen
    -> lädt nur 1 Element

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct item
    {
        int nr;
        int data;
        char daten[200000];
        struct item *next;
    };
    
    item* START = NULL;             // Zeiger auf den Anfang der Liste
    int cnt = 0;
    
    void print_list_2(void);
    
    void getlistitem()
    {
         int cnt=0;
         int suche=0;
         printf("Zu suchende Daten:");
         fflush(stdin);
         scanf("%d",&suche);
         printf("\n\n");
    
         item *DUMMY;
    
    	 DUMMY = START; // DUMMY soll auf den Listenanfang zeigen
    
    	 while (DUMMY)  // "solange DUMMY nicht auf NULL zeigt"
    	       {
               if(DUMMY->data==suche)
               {
               printf("Elementnummer:%d\nElementdaten: %d\n",DUMMY->nr,DUMMY->data);
               cnt++;
               }
    		   DUMMY = DUMMY -> next;
               }
         if(!cnt)
         printf("Kein solches Element vorhanden!\n");
    
         system("pause");
     }
    
    void do_einfuegen_anfang(void)
    {
    	// neues Element im Speicher anlegen
    	item *NEU;
    	NEU = (item*)malloc(sizeof(item));	
    
    	// Daten einlesen
    	printf("Daten fuer neues Element eingeben:");
    	int i;
    	scanf("%d",&i);
    
    	// Daten in Element eintragen
    	NEU->nr = ++cnt;
    	NEU->data = i;	 // ausführlich: (*NEU).data = i;
    
    	// Einketten in Liste
    	NEU->next = START;  // next-Zeiger des neuen Elementes soll dahin zeigen wo der START-Zeiger zeigt
    	START = NEU;        // START-Zeiger soll auf neues Element zeigen
    }
    
    void do_loeschen_anfang(void)
    {
    	if (!START) // ausführlich: (START == NULL)
    	{
    		printf("aus einer leeren Liste kann nicht geloescht werden!\n\n");
    		system("pause");
    		return;
    	}
    
    	item *X;  // Merken was das erste Element war
    	X = START;
    	START = START -> next; // auf zweites Element zeigen lassen
    	free(X);  // Speicher des "alten" ersten Elementes wieder freigeben
    }
    void loadlist(void)
    {
         FILE *daten;
    
         daten= fopen ("C:\\Dokumente und Einstellungen\\blb34611\\Eigene Dateien\\Programmierung\\Aufgabenblatt 12\\daten.txt","rb");
    
         item *DUMMY;
         item *hilf;
         DUMMY=(item*) malloc(sizeof(item));
         while(fread(DUMMY,sizeof(item),1,daten)!=NULL)
         {
         if(START==NULL)
         {
         START=DUMMY;
         DUMMY->next=NULL;
         }
         else
         {
    
         hilf=START;
    
         while(!hilf->next)
         {     
         hilf=hilf->next;
         }
         hilf->next=DUMMY;
         DUMMY->next=NULL;    
         }
         }
    
         fclose(daten);
    
    }
    
    void savelist(void)
    {
         FILE *daten;
    
         daten= fopen ("C:\\Dokumente und Einstellungen\\blb34611\\Eigene Dateien\\Programmierung\\Aufgabenblatt 12\\daten.txt","wb");
    
         item *DUMMY;
    
    	 DUMMY = START; // DUMMY soll auf den Listenanfang zeigen
    
    	 while (DUMMY)  // "solange DUMMY nicht auf NULL zeigt"
    	       {
               fwrite(DUMMY,sizeof(item),1,daten);
               DUMMY = DUMMY -> next;
               }
         fclose(daten);
    
    }
    
    void do_count(void)
    {
    	int anzahl = 0;
    
    	item *DUMMY;
    
    	DUMMY = START; // DUMMY soll auf den Listenanfang zeigen
    
    	while (DUMMY)  // "solange DUMMY nicht auf NULL zeigt"
    	{
    		anzahl++;
    		DUMMY = DUMMY -> next;
    	}
    
    	printf("Anzahl der Listenelemente: %d\n",anzahl);
    	system("pause");
    }
    
    void last_item(void)
    {
    	if (!START) // ausführlich: (START == NULL)
    	{
    		printf("Liste ist leer!\n\n");
    		system("pause");
    		return;
    	}
    
    	// Daten des letzten Elementes ausgeben lassen
    	item *DUMMY;
    
    	DUMMY = START; // DUMMY soll auf den Listenanfang zeigen
    
    	while (DUMMY->next) // ausführlich: (DUMMY->next != NULL)
    		DUMMY = DUMMY -> next;
    
    	// DUMMY zeigt jetzt auf das letzte Element
    
    	printf("Daten des letzten Elementes: %d\n",DUMMY->data);
    	system("pause");
    
    }
    
    void menue(void)
    {
        char s;
        do
        {
            print_list_2();
            printf("\n\nAuswahl:\n------------------------------\n");
            printf("a - neues Element am Anfang einfuegen\n");
            printf("e - neues Element am Ende einfuegen\n");
            printf("i - neues Element an Position einfuegen\n");
            printf("l - Element am Anfang loeschen\n");
            printf("s - Datensuche\n");
            printf("c - Anzahl der Elemente ausgeben\n");
            printf("z - Daten des letzten Elementes ausgeben\n");
            printf("p - Speichern der Liste\n");
            printf("r - Laden der Liste\n");
            printf("b - Programm beenden\n");
    
            printf("\n\nIhre Wahl-->");
            fflush(stdin);
            scanf("%c",&s);
            fflush(stdin);
    
            switch (s)
            {   
            case 'r':
                     loadlist();
                     break;
                case 'p':
                     savelist();
                     break;
                case 'a':
                    do_einfuegen_anfang();
                    break;
                case 'e':
                    //do_einfuegen_ende();
                    break;
                case 's':
                     getlistitem();
                     break;
                case 'i':
                    //do_einfuegen_pos();
                    break;
                case 'l':
                    do_loeschen_anfang();
                    break;
                case 'c':
                    do_count();
                    break;
                case 'z':
                    last_item();
                    break;
            }
        }
        while (s != 'b');
    }
    
    int main (void)
    {
        menue();    
        return 0;
    }
    
    void print_list_2(void)
    {
        system("cls");  // Bildschirm löschen
    
        printf("Liste:\n------------------------------\n");
    
        item *dummy = NULL;
        dummy = START;
        int pos = 0;
    
        if (!dummy)
            printf("keine Elemente in der Liste!\n");
    
        printf("START\n");
    
        while(dummy)
        {
            printf("EL-%02d",dummy->nr);
            if (dummy->next)
                printf(" --> ");
            else
                printf(" --> NULL ");
            dummy = dummy->next;
        }
        printf("\n");
    
        dummy=START;
    
        while(dummy)
        {
            printf("[%03d]     ",dummy->data);
            dummy = dummy->next;
        }
        printf("\n");
    }
    


  • void loadlist(void){
    ...
         while( :warning: ! :warning: hilf->next)
         {    
         hilf=hilf->next;
         }
    ...
    }
    

    davon mal abgesehen ist das teil eine absolute katastrophe entweder du fügst die dinger am anfang ein oder du merkst dir das letzte aber das immer wieder neu zu suchen, nene das ist total madig...


Anmelden zum Antworten