06. april 2002 - 10:24Der 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!
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.
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.
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.
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.
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.
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; }
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.)
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:
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!!
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 !
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.
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.
Synes godt om
Ny brugerNybegynder
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.