Avatar billede dalbjerg Nybegynder
25. april 2003 - 09:11 Der er 7 kommentarer og
1 løsning

Slet i en struct...

Hej

jeg har en struct, som se sådan ud:
struct bruger_info
{
char STbruger[40];
char STkortnummer[40];
char STkode[40];
struct bruger_info *naeste;
};
struct bruger_info *foerste, *sidste, *ny;


Der har jeg så smidt en par linier ind i. Men nu skal jeg slette den ene af dem, og jeg har kun STbruger. Den skal altså slette STbruger, STkortnummer & STkode for den pågældene.
Avatar billede dalbjerg Nybegynder
25. april 2003 - 09:17 #1
ups det skal være i c...
Avatar billede arne_v Ekspert
25. april 2003 - 09:23 #2
Det er jo en envejs kædet liste.

Du starter fra starten og følger links indtil du har fundet
den der skal fjernes og så sætter du den foregåendes naeste til
den fundnes naeste.

(og deallokerer memory)
Avatar billede dalbjerg Nybegynder
25. april 2003 - 09:24 #3
wov, hvordan mener du man skal gøre dette ??
Avatar billede arne_v Ekspert
25. april 2003 - 09:26 #4
Noget i retning af:

struct bruger_info *prev,*curr;
prev=null;
curr=foerste;
while(strcmp(curr->STbruger,"anders and")!=0) {
  prev=curr;
  curr=curr->naeste;
}
if(prev!=NULL) {
  prev->naeste=curr->naeste;
  free(curr);
} else {
  foerste=curr->naeste;
  free(curr);
}
Avatar billede dalbjerg Nybegynder
25. april 2003 - 09:38 #5
Jeg har smidt dette ind:

int sletbruger()
{
  struct bruger_info *prev,*curr;

  char soegte_navn[81];
  prev=NULL;
  curr=foerste;
 
  printf("Skriv navnet på vedkommet du vil havde slettet");
  scanf("%s", soegte_navn);
  while(curr != NULL)
  if(strcmp(curr->STbruger, soegte_navn) != 0) {
    prev=curr;
    curr=curr->naeste;
    printf("1");
  }
  if(prev != NULL) {
    prev->naeste=curr->naeste;
    free(curr);
  } else {
    foerste=curr->naeste;
    free(curr);
  }
  return 0;
}


men den kommer med en beskyttelse fejl nå jeg kører det.. :(
Hvis man taster 8 indslag, ind / eller hvis man taster ole, som der en bruger som hedder.
Avatar billede arne_v Ekspert
25. april 2003 - 09:47 #6
Altså koden kan kun håndtere situationen hvor der faktisk er et match.

Hvis den skal kunne håndtere ikke match, så skal den ændres til f.eks.:

  if(forest==NULL) return; 
  prev=NULL;
  curr=foerste;
  if(strcmp(curr->STbruger, soegte_navn) != 0) {
    prev=curr;
    curr=curr->naeste;
    if(curr==NULL) return;
}
Avatar billede arne_v Ekspert
25. april 2003 - 09:48 #7
Men hvis den er der burde det virke.

Jeg prøver lige at lave et eksempel.
Avatar billede arne_v Ekspert
25. april 2003 - 10:00 #8
Det her ser ud til at virke:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct bruger_info
{
  char STbruger[40];
  char STkortnummer[40];
  char STkode[40];
  struct bruger_info *naeste;
};

struct bruger_info *foerste = NULL;
struct bruger_info *sidste = NULL;

void add(char *bruger, char *kortnummer, char *kode)
{
  struct bruger_info *ny = (struct bruger_info *) malloc(sizeof(struct bruger_info));
  strcpy(ny->STbruger, bruger);
  strcpy(ny->STkortnummer, kortnummer);
  strcpy(ny->STkode, kode);
  ny->naeste = NULL;
  if(sidste!=NULL) {
      sidste->naeste = ny;
      sidste = ny;
  } else {
      foerste = ny;
      sidste = ny;
  }
  return;
}

void delete(char *bruger)
{
  struct bruger_info *prev,*curr;
  if(foerste==NULL) return;
  prev=NULL;
  curr=foerste;
  while(strcmp(curr->STbruger,bruger)!=0) {
      prev=curr;
    curr=curr->naeste;
    if(curr==NULL) return;
  }
  if(prev!=NULL) {
    prev->naeste=curr->naeste;
    free(curr);
  } else {
    foerste=curr->naeste;
    free(curr);
  } 
  return;
}

void show()
{
  struct bruger_info *curr = foerste;
  while(curr!=NULL) {
      printf("%s\n",curr->STbruger);
      curr=curr->naeste;
  }
  return;
}

int main()
{
  add("ole", "xxx", "xxx");
  add("jens", "xxx", "xxx");
  add("niels", "xxx", "xxx");
  add("peter", "xxx", "xxx");
  show();
  delete("jens");
  delete("nobody");
  show();
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester