Avatar billede danielhep Nybegynder
16. august 2004 - 16:42 Der er 27 kommentarer og
1 løsning

linked list ider

hey

jeg har lige programmeret en linked list, som inderholder disse funktioner:

int        main();
int        insert_begin(char *name, int location);
int        insert_end(char *name, int location);
int        count_elements(struct node *head);
int        output_all_nodes(struct node *head);
int        invoke_all_nodes(struct node *head);
struct    node*  CopyList(struct node *head);
int        delete_list(struct node *head);
int        search(char *name,int location);


indtil vidre er det bare en prototype som skal ende med at være OOP. 
Men jeg kunne godt tænke mig nogle gode ider til hvad man kunne uddvide den med rent funktions mæssigt.
Jeg ved der mangler en sort, så den er taget :=)
Avatar billede arne_v Ekspert
16. august 2004 - 16:44 #1
Har du overvejet at stjæle fra STL ?

http://www.cppreference.com/cpplist.html
Avatar billede narrr Nybegynder
16. august 2004 - 19:12 #2
jeg synes i hvert fald du skal slette output_all_nodes, da det ikke rigtig har noget med listen at gøre hvordan den bliver skrevet på skærmen. det skal brugeren selv klare. og ja, som arne siger, så kig på STL's list.
Avatar billede bertelbrander Novice
16. august 2004 - 19:21 #3
Der mangler måske funcktioner til at fjene et enkelt element fra listen, enten først eller sidst.
Du kunne også overveje om du vil kunne insætte og fjerne midt i listen.
Avatar billede danielhep Nybegynder
16. august 2004 - 22:02 #4
bertalbrander ->

Hvis jeg skulle indsætte en ny node midt i listen, ville det så ikke være temlig langsom at køre alle de enkelte noder igennem for at komme til en bestemte ?
Avatar billede bertelbrander Novice
16. august 2004 - 22:37 #5
Jo, du ville være nødt til at løbe listen igennem, hvis den er meget stor vil det tage nogen tid, men i praksis vil det måske ikke være et stort problem.

Men hvis du ønsker en sorteret liste er du nok nødt til det. Du kan også få brug for det hvis du vil bruge listen til f.ex. en medlems kartotek, man kan ikke gå ud fra at det altid er den ældste eller nyeste medlem der opsiger sit medlemsskab.

Du kan også lave et binært træ, men det er en anden historie.
Avatar billede danielhep Nybegynder
16. august 2004 - 22:40 #6
bertelbrander ->

Hvad mener du med at jeg kan bruge et binært træ ??
Avatar billede danielhep Nybegynder
16. august 2004 - 22:45 #7
arne_v >> hvordan specifisere man sin data structur med STL C++ list´s ?
Avatar billede bertelbrander Novice
16. august 2004 - 22:48 #8
Et binært træ er en anden måde at gemme data.

I en linket liste ligger noderne i en lang række.

I et træ har hver node en left og en right node og strukturen kommer til at ligne et træ.

I et træ gemmer man noderne efter en nøgle, dette kan være et navn eller et nummer. Når man skal finde et navn i træet bruger man denne nøgle til at bestemme ruten i træ'et.

Hvis man har en linket liste med 1000 noder vil man i værste tilfælde være nødt til at lede alle 1000 igennem. I et træ ville man højest skulle checke 10 elementer fordi 2^10 er 1024.
Avatar billede danielhep Nybegynder
16. august 2004 - 22:49 #9
bertelbrander -> det lyder ret smart med det binære træ.
Avatar billede danielhep Nybegynder
16. august 2004 - 22:49 #10
bertelbrander -> Men er det ikke ret svært at programmere således binært træ ?
Avatar billede bertelbrander Novice
16. august 2004 - 22:51 #11
Man kan bruge en stl-list med:

#include <list>

class Whatever
{
  ...
};
std::list<Whatever>MyList;
Avatar billede bertelbrander Novice
16. august 2004 - 22:54 #12
Ja og nej.

Grundstammen er ret let, men der er flere ting der kan være besværlige:
1: Det er lidt besværligt at løbe listen igennem fra en ende af.
2: Det er lidt svært at slette tilfældige noder.
3: Hvis nøglen ikke er random kan træet blive skævt og man vil være nødt til at balancere det hvilket er lidt bøvlet.

stl har en map der (typisk) er et træ.
Avatar billede danielhep Nybegynder
16. august 2004 - 22:56 #13
bertelbrander ->

Mener du:

Whatever indeholder de funktioner til listen, og list er selve vectoren og std er det namespace hvor list kommer fra ?
Avatar billede arne_v Ekspert
16. august 2004 - 22:57 #14
Eksempel på list:

#include <iostream>
#include <list>

using namespace std;

int main()
{
  list<int> lst;
  list<int>::iterator it;
  lst.push_back(3);
  lst.push_back(2);
  lst.push_back(1);
  for(it=lst.begin();it!=lst.end();it++) cout << *it << endl;
  lst.sort();
  for(it=lst.begin();it!=lst.end();it++) cout << *it << endl;
  return 0;
}
Avatar billede bertelbrander Novice
16. august 2004 - 22:59 #15
Whatever er en struct/class der indeholder det der skal gemmes, list er en stl-kontainer (en template class), der har metoder som push_back og pop_front til at operere på listen, std:: namespace, og listen kommer til at hedde MyList.

Jeg kan godt lave et lille eksempel.
Avatar billede danielhep Nybegynder
16. august 2004 - 23:02 #16
Bertalbrander -> Det må du meget gerne :)
Avatar billede bertelbrander Novice
16. august 2004 - 23:04 #17
Hvad mangler der i Arne's eksempel?
Avatar billede danielhep Nybegynder
16. august 2004 - 23:07 #18
Bertalbrander -> hmmm...jeg forstår det ikke helt....men det betyder heller ikke store...mit spørgsmål er bleven besvaret, så Arne giv et svar. :)

Takker for hjælpen Bertelbrander :)
Avatar billede bertelbrander Novice
16. august 2004 - 23:16 #19
Jeg lavede lige et eksempel, hvis der er noget du ikke forstår, så sprøg.

#include <list>
#include <iostream>
#include <string>

class MemberClass
{
public:
  MemberClass(std::string aName)
  {
      Name = aName;
      Number = NextNumber++;
  }
  friend std::ostream &operator << (std::ostream &os, const MemberClass &Member);
private:
  std::string Name;
  int Number;
  static int NextNumber;
};

std::ostream &operator << (std::ostream &os, const MemberClass &Member)
{
  os << Member.Number << " " << Member.Name << std::endl;
  return os;
}

std::list <MemberClass>MyList;

int main()
{
  int i;
  for(i = 0; i < 3; i++)
  {  // Add 3 members
      std::string St;
      std::cout << "Enter Name: ";
      std::cout.flush();
      std::getline(std::cin, St);
      MyList.push_back(MemberClass(St));
  }
  std::list <MemberClass>::iterator idx;
  // Print the list
  for(idx = MyList.begin(); idx != MyList.end(); idx++)
      std::cout << *idx;
}

int MemberClass::NextNumber;
Avatar billede arne_v Ekspert
16. august 2004 - 23:17 #20
svar
Avatar billede danielhep Nybegynder
16. august 2004 - 23:25 #21
ok..he he...hvad er det ?

friend std::ostream &operator << (std::ostream &os, const MemberClass &Member);

std::ostream &operator << (std::ostream &os, const MemberClass &Member)
Avatar billede arne_v Ekspert
16. august 2004 - 23:26 #22
Det er det som gør at MemberClass kan udskrives med <<.
Avatar billede danielhep Nybegynder
16. august 2004 - 23:30 #23
arne_v -> ok.  Det kan jeg godt se hver du mener lidt sådan.
Avatar billede arne_v Ekspert
16. august 2004 - 23:34 #24
Konstruktionen ser bizar ud. Men det er helt standard. Ja bortset fra at jeg
ikke ville have skrever linie skift i den.
Avatar billede danielhep Nybegynder
16. august 2004 - 23:34 #25
den nederste linie...hvad er det til ?

int MemberClass::NextNumber;
Avatar billede arne_v Ekspert
16. august 2004 - 23:36 #26
static felter skal i C++ implementeres på den måde
Avatar billede danielhep Nybegynder
16. august 2004 - 23:37 #27
arne_v >> ja, den ser lidt bizar ud, når man lige kigger på det hurtigt.  Men jeg tror jeg har fået meget godt fat i det nu. :)

Man kunne jo bare ændre sin MemberClass´s data members, og tilføje nogle flere...
Avatar billede bertelbrander Novice
16. august 2004 - 23:42 #28
Den sidste loop ville hardcore C++ programmører vist lave som:

std::copy(MyList.begin(), MyList.end(), std::ostream_iterator<MemberClass>(std::cout, "\n"));

Og include algorithm og iterator, samt fjene std::endl fra << operatoren
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