Avatar billede lillefisk Nybegynder
17. maj 2005 - 11:17 Der er 4 kommentarer og
1 løsning

Sortering af linket liste

Hej eksperter :)

Er der nogle der kender en (relativ) simpel metode at sortere en linket liste på?
(gerne et kode eksempel)
Performans er helt uden betydning.

Jeg bruger MS Visual C++ 6.0

Min linkede liste er opbygget af følgende:

//----------------------------------------------------------
// INCLUDE STATEMENTS
//----------------------------------------------------------
#include <string>
using namespace std;


class ITEM {
  public:
//----------------------------------------------------------
// MEMBER VARIABLES
//----------------------------------------------------------
      char File[260];
      char Name[50];
      ITEM *next;
      ITEM *prev;
//----------------------------------------------------------
// CONSTRUCTOR
//----------------------------------------------------------
      ITEM(char name[50], char file[260]) {
          next = NULL;
          prev = NULL;
          strcpy(Name, name);
          strcpy(File, file);
      }
};


class LIST {
    public:
//----------------------------------------------------------
// MEMBER VARIABLES
//----------------------------------------------------------
        ITEM *item;
        unsigned long int number;
//----------------------------------------------------------
// CONSTRUCTOR
//----------------------------------------------------------
        LIST() {
            item = NULL;
            number = 0;
        }
//----------------------------------------------------------
// DESTRUCTOR
//----------------------------------------------------------
        ~LIST() {
            ITEM *p=item;
            unsigned int t=0;
            while(p && number) {
                number--;
                if (p->next!=NULL) {
                    ITEM *tmp=p;                        p=p->next;
                    delete tmp;
                }
                else delete p;
            }
        }
//----------------------------------------------------------
// CLASS MEMBER FUNCTION DECLARATIONS/DEFINITIONS
//----------------------------------------------------------

//----------------------------------------------------------
// add_item
//----------------------------------------------------------
        void add_item(char *name, char *file) {
           
            if ((name!=NULL) && (strcmp(file,".")) && (strcmp(file, ".."))) {
               
                ITEM *p = new ITEM(name, file);
                if (item==NULL) {
                    item=p;
                }
                else {
                    p->next=item;
                    item->prev=p;
                    item=p;
                }
                number++;
            }
        }

//----------------------------------------------------------
// remove_STB
//----------------------------------------------------------
        void remove_item(char *name) {
            ITEM *p=item;
            while(p) {
                if (!strcmp(p->Name,name)) {
                    if (p->next!=NULL) {
                        p->next->prev=p->prev;
                        p->prev->next=p->next;
                        delete p;
                        number--;
                        break;
                    }
                }
                p=p->next;
            }
        }
};
Avatar billede bertelbrander Novice
17. maj 2005 - 19:58 #1
At sortere en linket liste er aldrig helt simpelt. Den letteste måde er at fjerne elementer fra listen, en af gangen, og indsætte dem i en ny sorteret liste og så bytte de to lister til slut.

Jeg har et eksempel her:
http://home20.inet.tele.dk/midgaard/snip/linklist.html
Måske kan det give en ide til hvordan man kan gøre.
Avatar billede arne_v Ekspert
18. maj 2005 - 08:48 #2
jeg lavede engang det her eksempel:

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

struct node
{
  char *name;
  int val;
  struct node *next;
  struct node *prev;
};

struct node *first2last(struct node *first)
{
    struct node *last;
    last = first;
    if(last!=NULL) while(last->next!=NULL) last=last->next;
    return last;
}

void add(struct node **first, char *name, int val)
{
    struct node *extra,*last;
    extra = (struct node *)malloc(sizeof(struct node));
    extra->name = name;
    extra->val = val;
    extra->next = NULL;
    if(*first==NULL)
    {
        *first = extra;
        extra->prev = NULL;
    }
    else
    {
        last = *first;
        while(last->next!=NULL) last=last->next;
        last->next = extra;
        extra->prev = last;
    }
}

void print(struct node *first)
{
    struct node *curr;
    printf("----------------\n");
    curr = first;
    while(curr!=NULL)
    {
        printf("%s %d\n",curr->name,curr->val);
        curr = curr->next;
    }
    printf("----------------\n");
}

void print2(struct node *last)
{
    struct node *curr;
    printf("----------------\n");
    curr = last;
    while(curr!=NULL)
    {
        printf("%s %d\n",curr->name,curr->val);
        curr = curr->prev;
    }
    printf("----------------\n");
}

void sort(struct node **first)
{
    struct node *p1,*p2,*pp1,*pp2,*temp;
    p1 = *first;
    pp1 = NULL;
    while(p1!=NULL)
    {
        pp2 = p1;
        p2 = p1->next;
        while(p2!=NULL)
        {
            if(p2->val < p1->val)
            {
                /* swap pointers */
                temp = p2;
                p2 = p1;
                p1 = temp;
                /* update next and prev pointers */
                if(p2->next!=p1)
                {
                    temp = p2->next;
                    p2->next = p1->next;
                    if(p1->next!=NULL)
                    {
                        p1->next->prev = p2;
                    }
                    p1->next = temp;
                    if(temp!=NULL)
                    {
                        temp->prev = p1;
                    }
                    pp2->next = p2;
                    p2->prev = pp2;
                }
                else
                {
                    p2->next = p1->next;
                    if(p1->next!=NULL)
                    {
                        p1->next->prev = p2;
                    }
                    p1->next = p2;
                    p2->prev = p1;
                }
                if(pp1==NULL)
                {
                    *first = p1;
                    p1->prev = NULL;
                }
                else
                {
                    pp1->next = p1;
                    p1->prev = pp1;
                }
            }
            pp2 = p2;
            p2 = p2->next;
        }
        pp1 = p1;
        p1 = p1->next;
    }
}

int main()
{
  struct node *first = NULL;
  add(&first, "a", 111);
  add(&first, "bb", 22);
  add(&first, "ccc", 3);
  printf("usorteret:\n");
  print(first);
  printf("usorteret (omvendt):\n");
  print2(first2last(first));
  sort(&first);
  printf("sorteret:\n");
  print(first);
  printf("sorteret (omvendt):\n");
  print2(first2last(first));
  add(&first, "d", 4);
  add(&first, "e", 5);
  printf("usorteret:\n");
  print(first);
  printf("usorteret (omvendt):\n");
  print2(first2last(first));
  sort(&first);
  printf("sorteret:\n");
  print(first);
  printf("sorteret (omvendt):\n");
  print2(first2last(first));
  return 0;
}
Avatar billede lillefisk Nybegynder
18. maj 2005 - 14:50 #3
De ser begge ud til at løse opgaven :)

Hvis I smider et svar hver, så får I jeres point.
Avatar billede arne_v Ekspert
18. maj 2005 - 15:17 #4
kommer her
Avatar billede bertelbrander Novice
19. maj 2005 - 00:30 #5
Jeg samler ikke på point.
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