struktur "löschen"/leeren



  • hey, angenommen ich habe folgende strukturen:

    struct user{
    
    char name[10];
    }
    
    struct usertable{
    
    struct user users[5];
    } * table;
    

    und z.Z. hat eine instanz von "usertable" 3 users gespeichert.
    wie kann ich jetzt z.B. den zweiten user löschen?

    also dass im array von usern an der stelle 1 (=2ter user) nichts mehr auf einen user zeigt..

    ich hatte es so probiert:

    table->users[1] = NULL;
    

    geht aber nich, wie geht denn sowas eigentlich? Oder muss ich mir dafür eine funktion schreiben, die alle attribute eines users auf standard-werte setzt?

    Wichtig wäre halt, dass ich danach, wenn ein neuer user kommt, ihn an den nächsten freien platz im usertable setze, also in dem beispiel an stelle 1.

    also sowas wie (pseudo-code für eine funktion "addUser"):

    int i = 0;
    for(; i<MAXUSERS; i++){
       if (table->users[i] == NULL){
           ...  // user da rein stecken
           return EXIT_SUCCESS;
       }
    printf("Sorry, maximum number of users reached.\n");
    return EXIT_SUCCESS;
    }
    

    nur dass das eben mit NULL wohl alles nicht geht.

    Dank euch 🙂



  • Entweder du läst den Namen für einen gelöschten user leer

    table->users[1].name[0] = 0; //0 für string ende, nicht pointer auf NULL
    
    int i = 0;
    for(; i<MAXUSERS; i++){
       if (table->users[i].name[0] == 0){
           ...  // user da rein stecken
           return EXIT_SUCCESS;
       }
    printf("Sorry, maximum number of users reached.\n");
    return EXIT_SUCCESS;
    }
    

    Oder verwendest in deiner Struktur ein Array von Pointern auf die user, nen Pointer kannst du dann auf NULL setzen.



  • Hi !
    Für nicht allzu grosse Listen könntest du sowas hier benutzen:

    #define NAME_LEN 25
    #define USERS 5
    
    struct user
    {
    	char name[NAME_LEN+1];
    };
    
    struct usertable
    {
    	struct user users[USERS];
    	int n;	// aktuelle anzahl der user in der usertable 			
    }table={ 0, 0 };
    
    void show_users()
    {
    	int i;
    	if ( !table.n ) puts("Empty list.");
    	for ( i=0; i<table.n; i++ ) puts( table.users[i].name );
    }
    
    void clear_list()
    {
    	memset( &table, 0, sizeof(table));
    }
    
    int add_user( char* name )
    {
    	if( table.n == USERS )
    	{
    		puts("The list is full.");
    		return 1;
    	}
    	strncpy( table.users[table.n].name, name, NAME_LEN ); 
    	table.n++;
    	return 0;
    }
    
    void remove_user_at( int pos )
    {
    	if ( pos < 0 || pos >= USERS || pos>=table.n ) return;
    	table.n--;
    	memmove( &table.users[pos], &table.users[pos+1], (table.n-pos)*sizeof(struct user));
    }
    
    void remove_user( char* name )
    {
    	int i, found = 0;
    
    	if ( !table.n ) return;
    
    	for ( i=0; i<table.n; i++ )
    	{
    		if ( strcmp( table.users[i].name, name ) == 0 )
    		{
    			remove_user_at( i );
    			printf( "%s removed from list.\n", name );
    			found = 1; i--;
    		}
    	}
    
    	if( !found ) printf( "%s not found, can't remove from list.\n", name );
    
    }
    
    int main()
    {
    
    	add_user( "Joe1"  );
    	add_user( "Joe2"  );
    	add_user( "Joe3"  );
    	add_user( "Joe4"  );
    	add_user( "Joe5"  );
    
    	show_users();
    	remove_user( "Joe3" );
    	show_users();
    
    	clear_list();
    	show_users();
    
    	add_user( "Joe"  );
    	add_user( "Joe"  );
    	add_user( "Joe"  );
    	add_user( "Joe"  );
    	add_user( "Joe"  );
    
    	show_users();
    
    	remove_user( "Joe" );
    	show_users();
    
    }
    

    🙂



  • anstatt
    if ( pos < 0 || pos >= USERS || pos>=table.n )
    sollte
    if ( pos < 0 || pos>=table.n )
    reichen


Anmelden zum Antworten