Avatar billede rdc Nybegynder
20. oktober 2006 - 16:04 Der er 6 kommentarer og
1 løsning

Linked list sortering

hejsa, vi har kigget her på eksperten specielt denne tråd:

http://www.eksperten.dk/spm/417877

Men har stadig ikke haft heldet med os, og fået det til at fungere som vi gerne vil have det.

Her er vores kode:

Vores structer:

//Main linked list
struct node{
    char* navn;
    int    karakter;
    struct node* next;
};
struct node* head; //Headpointer

Vores funktion til at brugeren kan tilføje nye data:

//Metode til tilføjning af nye studerende
newentry(){
    //struct node* first=NULL;
    //struct node* parent=NULL;
    struct node* node;
    int karakter;
    char* navn = malloc(255); //allokering
    struct node* n;

    printf("\nName: ");
    scanf("%s",navn);

    printf("Grade: ");
    scanf("%d", &karakter);
   
    n = malloc(sizeof(struct node)); //Allokering af node
    n->navn = navn;
    n->karakter = karakter;

    if(head == NULL)
        //Første node,dvs sidste i listen så den får tildelt NULL som nextpointer
        n->next = NULL;
    else{
       
    //    parent -> next = node;
    //    parent = node;
        n->next = head; //Ellers tildeles forrige headpointer til nextpointer
    }
    head = n; //Ny headpointer

}

Vi udskriver med:

//Metode til udskrivning af linked list
void gradelist(struct node *h){
    if(h == NULL){
        printf("\nList is empty");
    }
    while(h != NULL){
        printf("%s\t\t%d\n",h->navn,h->karakter);
        h=h->next;
    }
}


Det er så her vi gerne vil udskrive:

void increase(struct node *h){

    /*
    head contains the first element from the original linked list
    remaining contains the rest of the list
    */
    struct node *head=NULL, *remaining, *first=NULL, *parent=NULL;
    int i = 0, headlistlength;

    printf("Order list in increasing order\n");

   
  // Split list in two
    while (h != NULL){
        if (i == 0){
            h = (struct node*)malloc(sizeof(struct node));
            h->navn = h->navn;
            h->karakter = h->karakter;
            h->next = NULL;
        }
        else {
            remaining = (struct node*)malloc(sizeof(struct node));
            if (i == 1) first = remaining;
            remaining->navn = h->navn;
            remaining->karakter = h->karakter;
            remaining->next = NULL;
            parent->next = remaining;
            parent = remaining;
        }
        //struct node* node;
       
        h = h->next;
        i++;
    }

    gradelist(first);

}

Problemet er at når vi kører programmet.. så melder den ikke fejl.. Men hvis vi tilføjer nyt data i programmet fx:

Navn: Test
Karakter: 10

, så udskriver den at intet...

Hvis vi så vælger at tilføje 2 dataer som fx følgende:

Navn: Test
Karakter: 10

Navn: Test1
Karakter: 10

Så udskriver den kun:

Navn: Test
Karakter: 10

Den udskriver altså ikke den sidste data værdi, og nogle gang vælger den ligepludselig ikke at udskrive noget...


Hvis nogen kunne hjælpe ville det være super dejligt... For vi er sådan set gået i stå lige nu, og kan ikke komme videre...

På forhånd tusind tak.
Avatar billede bertelbrander Novice
21. oktober 2006 - 00:55 #1
Jeg har lavet noget der ser ud til at virke:

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

//Main linked list
struct node
{
    char* navn;
    int    karakter;
    struct node* next;
};
struct node* head; //Headpointer

//Metode til tilføjning af nye studerende
void newentry(void)
{
    //struct node* first=NULL;
    //struct node* parent=NULL;
    struct node* node;
    int karakter;
    char* navn = malloc(255); //allokering
    struct node* n;

    printf("\nName: ");
    scanf("%s",navn);

    printf("Grade: ");
    scanf("%d", &karakter);

    n = malloc(sizeof(struct node)); //Allokering af node
    n->navn = navn;
    n->karakter = karakter;

    if(head == NULL)
        //Første node,dvs sidste i listen så den får tildelt NULL som nextpointer
        n->next = NULL;
    else{

    //    parent -> next = node;
    //    parent = node;
        n->next = head; //Ellers tildeles forrige headpointer til nextpointer
    }
    head = n; //Ny headpointer

}

//Metode til udskrivning af linked list
void gradelist(struct node *h)
{
    if(h == NULL)
    {
        printf("\nList is empty");
    }
    while(h != NULL)
    {
        printf("%s\t\t%d\n",h->navn,h->karakter);
        h=h->next;
    }
}

void sort(struct node *h)
{
  struct node *temp = h;
  h = h->next;
  temp->next = 0;
  while(h)
  {
      struct node *candidate = 0,  *node;
      struct node* next = h->next;
      for(node = temp; node && node->karakter < h->karakter; node = node->next)
      {
        candidate = node;
      }
      if(candidate)
      {  // Insert after candiate
        h->next = candidate->next;
        candidate->next = h;
      }
      else
      {  // before first in list
        h->next = temp;
        temp = h;
      }
      h = next;
  }
  head = temp;
}

int main(void)
{
  newentry();
  gradelist(head);
  newentry();
  gradelist(head);
  newentry();
  gradelist(head);
  sort(head);
  printf("Sorted: \n");
  gradelist(head);
  return 0;
}

Det er stadig noget rodet.
Ideen i sorteringen er at tage et element fra den gamle liste og putte over i en ny liste, idet man idsætter dem på den rigtige plads.
Avatar billede arne_v Ekspert
21. oktober 2006 - 03:02 #2
for en 3 år siden lavede jeg følgende kode vistnok til samme opgave:

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

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

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;
    }
    else
    {
        last = *first;
        while(last->next!=NULL) last=last->next;
        last->next = extra;
    }
}

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 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 pointers */
                if(p2->next!=p1)
                {
                    temp = p2->next;
                    p2->next = p1->next;
                    p1->next = temp;
                    pp2->next = p2;
                }
                else
                {
                    p2->next = p1->next;
                    p1->next = p2;
                }
                if(pp1==NULL)
                {
                    *first = p1;
                }
                else
                {
                    pp1->next = p1;
                }
            }
            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);
  sort(&first);
  printf("sorteret:\n");
  print(first);
  add(&first, "d", 4);
  add(&first, "e", 5);
  printf("usorteret:\n");
  print(first);
  sort(&first);
  printf("sorteret:\n");
  print(first);
  return 0;
}
Avatar billede rdc Nybegynder
23. oktober 2006 - 13:45 #3
tusind tak for jeres hjælp men fandt selv en løsning:

int increase(){
    struct node *headO, *headR, *first, *parent;
   
    if(head == NULL) return 1;
    headO = head;
    headR = head->next;
    headO->next = NULL;
    do{
        first = headO;
        while (first->next != NULL){
            if(first->next->karakter < headR->karakter){
                first = first->next;
            }else{
                break;
            }
        }
        if(first == headO && first->karakter > headR->karakter) {
            parent = headR->next;
            headR->next = headO;
            headO = headR;
            headR = parent;
        }else{
            parent = headR->next;
            headR->next = first->next;
            first->next = headR;
            headR = parent;
        }
    }
    while(parent != NULL);
   
    head = headO;
}
Avatar billede arne_v Ekspert
09. december 2006 - 23:55 #4
rdc ??
Avatar billede rdc Nybegynder
02. januar 2007 - 19:27 #5
opret et svar begge to...
Avatar billede arne_v Ekspert
02. januar 2007 - 19:47 #6
ok
Avatar billede bertelbrander Novice
02. januar 2007 - 23:30 #7
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