Avatar billede hansent Nybegynder
06. april 2002 - 10:24 Der er 13 kommentarer og
2 løsninger

Algorithms

Hej,
Jeg skal skrive en algorithm for functionerne int addrecord og int delterecord ved brug af singly linked list.

Name field vil blive brugt som noegle i database. Addrecord skal add record til slutningen af listen. Deleterecord vil slette first matching record baseret paa navnet.
Man skal kunne oversaette det til C++ med lethed, men man maa kun bruge if og while loops i algorithmen.
Antag  at informationen passed igennem functionerne  are klar til at blive taget i brug af algorithmen og er alllerede i stack.

Denne struct skal benyttes:
struct record
{
  char name [32];
  char address[80];
  char telno[15];
  float gpa;
  record *next;
};
Er der en der kan hjaelpe mig med tankegangen i denne opgave?
Paa forhaand tak!
Avatar billede hansent Nybegynder
06. april 2002 - 10:27 #1
jeg glemte:
addrecord test cases:
-add record til tomme liste
-add record til liste med tre records

deleterecord test cases:
-delete foerste record fra list med tre records
-delte tredje record fra liste med 4 records
Avatar billede greybeard Nybegynder
06. april 2002 - 13:26 #2
record* first;

int addrecord (record* r)
{
    // PRE: no dummy header
    // PRE: r->next == null;
    record* current;
    int count = 0;
    if (current = first)
    {
        count++;
        while(current->next)
        {
            count++;
            current = current->next;
        }
        current->next = r;
    }
    else // empty list
        first = r;
    return ++count;
}

bool equals(record* r1, record* r2)
{
    bool eq;
    // implement equals
    return eq;
}

int deleterecord (record* r)
{
    // PRE: equals method has been made
    record* current;
    record* previous;
    int count;
    if (!(current = first))
        return -1;// List empty
    else
    {
        count++;
        previous = first;
        if (equals(r, current))// r is first element
        {
            first = current->next;
            delete current;
            return count;//record matched the first node and was deleted
        }
        while(current->next)
        {
            count++;
            previous = current;
            current = current->next;
            if (equals(r, current))
            {
                previous->next = current->next;
                delete current;
                return count; //record matched the count'th node and was deleted
            }
        }
    }
    return -1; // record not found
}

Dette her skulle kunne gøre det.
Der kan undgås noget koderedundans, hvis listen har en dummy-header, så man ikke skal tage højde for det særtilfælde at listen er tom.
Avatar billede hansent Nybegynder
06. april 2002 - 22:43 #3
Hej greybeard,
Mange tak for dit svar. Jeg tror at jeg var daarlig til at forklare mig, for opgaven maa ikke inholde noget C++ sprog, kun algoritmer der skal kunne oversaettes til C++.
F.eks:
1. Definer en pointer til record kaldet first.
2. Copy records name field som har adressen.....
3. etc.

Jeg ved bare ikke hvordan det gribes an, er det noget du kan hjaelpe mig med?
Jeg undskylder at jeg gav en daarlig forklaring.
Avatar billede greybeard Nybegynder
07. april 2002 - 04:40 #4
int addrecord

1. definer en recordpointer current.
2. definer en int count, og sæt den = 0.
3. sæt current = first.
4. tæl count op.
5. hvis current = null, så sæt first = nyRecord.
6. ellers sålænge currents next ikke peger på null, så tæl count op og sæt current til den næste.
7. sæt currents next til nyRecord.
8 tæl count op og returner den.

int deleterecord

1. definer en recordpointer current.
2. definer en recordpointer previous.
3. definer en int count og sæt count = 0.
4. hvis first = null så returner -1 for at fortælle at listen er tom
5. sæt current = first, og tæl count op.
6. hvis current = deleteRecord, så sæt first til at pege på det som firsts next ny peger på.
7. ( og hvis C++ kode så slet current)
8. og returner count.
9. sålænge currents next ikke peger på null, såsæt previous = current, sæt current = currents next og tæl count op.
10. og hvis current = deleteRecord, så sæt previous' next = currents next.
11. ( og hvis C++ kode så slet current)
12 returner count for at fortælle hvilken record, der blev slettet.
13 hvis udførelsen når her til er deleteRecord ikke fundet, så reurner 0.

Noget i den stil
Avatar billede soepro Nybegynder
08. april 2002 - 08:52 #5
Ovenstående pseudo-kode er vist blot en oversættelse af C algoritmen. Hvad med:

navn: addRecord
funktion: tilføj post til slut af kædet liste
parameter: post, en datastruktur af typen record
returværdi: sand hvis post tilføjet, falsk ellers

logik: 1) find sidste post i kædet liste. (Hvis max størrelse nået
          returner falsk.)
      2) sæt denne post's "next" pointer til at pege på den nye post
      3) sæt den nye post's "next" pointer til at pege på NULL
      4) returner sand


navn: deleteRecord
funktion: slet post fra kædet liste
parameter: post, en datastruktur af typen record
returværdi: sand hvis post slettet, falsk ellers

logik: 1) gennemsøg kædet liste fra start til slut
      2) hvis navn på element i kædet liste matcher navn på overførte post:
          - Flyt indhold af nuv. post's "next" pointer til forrige post's
            "next" pointer.   
          - returner sand
      3) Returner falsk.
Avatar billede soepro Nybegynder
08. april 2002 - 08:53 #6
Sidste 3) burde nok være:

3) Hvis slut på liste nået, returner falsk.
Avatar billede hansent Nybegynder
08. april 2002 - 10:44 #7
Hej soepro,
Mange tak for din hjaelp.
Kan jeg bede dig om at forklare hvad "post" (er det record?)helt konkret betyder og eventuelt oversaette algoritmen til C++, saa jeg kan se om jeg forstaar det.
er der taget hoejde for:
addrecord test cases:
-add record til tomme liste
-add record til liste med tre records

deleterecord test cases:
-delete foerste record fra list med tre records
-delte tredje record fra liste med 4 records
Ja, som det nok skinner igennem saa er jeg nybegynder i C++, saa det virker nok som nogle irriterende lette spoergsmaal.
Endnu engang tak for hjaelpen.
Avatar billede soepro Nybegynder
08. april 2002 - 11:16 #8
En post er ganske rigtigt en record. (post = dansk standard) C++ koden har du jo egentlig ovenfor, men pyt:

record *first;

bool addRecord(record *post)
{
  record *last;
  /* Først finder vi enden på listen. */
  if (first == NULL)
    /* Tom listen - indsæt post her. */
    first = post;
  else
  {
    /* Søg igennem listen til slut. */
    last = first;
    while (last->next != NULL)
      last = last->next;
    last->next = post;
  };
  post->next = NULL;
  return true;
}

bool deleteRecord(record *post)
{
  record *last, *current;
  last    = NULL;
  current = first;
  while (current != NULL)
  {
    /* Check om denne record matcher den der skal slettes. */
    if (strncpy(current->navn, post->navn, sizeof(current->navn)-1) == 0)
    { /* Match - fjern current fra den kædede liste. */
      if (last == NULL)
        /* Første post i listen - dvs. flyt 'first' pointeren. */
        first      = current->next;
      else
        /* Inde i listen - flyt pointeren på forrige til at pege på den næste, dvs. den efter current. */
        last->next = current->Next;
      return true;
    };
    /* Matcher ikke - hop videre til næste i den kædede liste. */
    last    = current;
    current = current->next;
  }
  /* Posten blev ikke fundet. */
  return false;
}
Avatar billede soepro Nybegynder
08. april 2002 - 11:22 #9
Er selvfølgelig fortsat et svar !

BEMÆRK at du selv skal sørge for at "delete" post, hvis du har lavet den vha. "new". Husk den lænkede liste består i virkeligheden kun af first pointeren - som peger på det første led i kæden. Hverefter peger hvert led videre til det næste led - og det sidste led peger på NULL, dvs. "ned i jorden". (NULL - ligesom NUL/JORD når man snakker strøm - derfor ned i jorden.) Når du fjerner et "led" som i deleteRecord ovenfor, mister på "kontakten" med det, hvis ikke "leddet" kan tilgås (refereres) på en anden måde. (F.eks. ved at du har defineret alle dine poster vha. record poster[9999] eller lignende.)
Avatar billede hansent Nybegynder
09. april 2002 - 11:43 #10
Hej soepro,
Takker mange gange for svaret. Hvis jeg vil compile programmet, vil det saa vaere en god ide at bruge commandline arguments?
Avatar billede soepro Nybegynder
09. april 2002 - 12:45 #11
om du skal bruge commandline arguments for at compilere afhænger af din compiler !!!

Hvis du skal køre dine testcases igennem, kan du ikke anvende commandline arguments, fordi programmet så skal afsluttes mellem hvert kald - og så bliver din kædet liste jo ikke gemt fra gang til gang.

Commandline argumenter er det som du skriver efter navnet på programmet, når du starter det fra en DOS-boks, ligesom '*.' og '/OGNE' er commandline arguments til DIR-kommandoen her:

DIR *. /OGNE
Avatar billede hansent Nybegynder
11. april 2002 - 11:47 #12
Ja, jeg traekker det i langdrag, men det er desvaerre fordi det ikke virker og at jeg har vaeret daarlig til at forklare mig.
Dette er et eksempel paa hvordan det skal goeres:
1. Define a pointer to record called temp
2. While the next field of the record whose address is in temp is not NULL
2.1 copy the name field of the record whose address is in temp into the name field of the record whose address is in temp2
2.2 Delete the record whose address is in temp.
3. Allocate space for a new record and store its address in temp

Det der er i min stack skal fyldes op i min heap. Altsaa
name
address
telno
gpa
Mine to functioner hedder:
int addrecord (record*& head, char name[], char address[],char telno[], float gpa);
int deleterecord (record *& head, char name[]);


Det er altsaa ikke fordi jeg ikke vil af med mine points, jeg vil meget gerne give mere end lovet.
Paa forhaand tak!!
Avatar billede soepro Nybegynder
11. april 2002 - 13:27 #13
hansent >> Hvad er det så du forlanger ??? Et komplet program eller hvad ? Ovenstående algotime virker fint - du kan jo prøve at lægge dem ind i en main() og se selv !
Avatar billede greybeard Nybegynder
11. april 2002 - 14:07 #14
Først beder du om noget, der umiddelbart kan lave til C++ kode, dernæst siger du at det ikke må indeholde noget, der ligner C++ kode, og nu kommer du med to funktions definitioner i C++, som det skal passe til.
Ved du selv hvad du vil??.
Eksperten er ment som hjælp til selvhjælp. Ellers læg dit spørgsmål ind under opgever.
Avatar billede hansent Nybegynder
13. april 2002 - 20:08 #15
Ja, jeg var klar over at det ikke ville falde i god jord.
De opgaver jeg har, er med vilje formuleret forvirrende fra min laerer, da han synes det er vigtigt at laere hvordan man skal gribe tingene an i en job situation. Og jeg har saa proevet at oversaette det til det jeg tror det betyder.
Jeg undskylder ulejligheden, i faar jeres points.
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