Avatar billede dragnor Juniormester
04. februar 2004 - 12:33 Der er 3 kommentarer og
1 løsning

dobbelthægtet liste

Det som jeg ønsker er følgede:

en dobbelt hægtet liste som kan håndter det her.

den vandrette linje skal illustere et array
og de lodrette er hægtet lister koblet til.

s1 s2 s3 s4 s5 s6
  1  1  1  1  1
  1  1    1 
  1 

dvs at de hægtede lister kan have forskellige længder. Men er knyttet til en bestemt plads i arrayet.

jeg har det her kode, som jeg kæmper med:

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

struct node
{
  char *seg;
  int sta;
  struct node *next;
};

void add(struct node **first, char *seg)
{
    struct node *extra,*last;
    extra = (struct node *)malloc(sizeof(struct node));
    extra->seg = seg;
    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;
    curr = first;
    while(curr!=NULL)
    {
        printf("%s\n",curr->seg);
        curr = curr->next;
    }
}

//denne main del er kun for at teste!

int main()
{
  struct node *first = NULL;
  add(&first, "s1");
  add(&first, "s2");
  add(&first, "s3");
  add(&first, "s4");
  add(&first, "s5");
  add(&first, "s6");
  print(first);
  return 0;
}
Avatar billede bertelbrander Novice
04. februar 2004 - 19:14 #1
Jeg ved ikke rigtigt hvad der er dit spørgsmål.

Vil du lave et array af linkede lister eller en linket liste af arrays?

Koden fejler ikke noget bortset fra:
1: Det er en enkelt linket liste, og ikke en dobbelt linket liste.
2: Du bør trevle listen op og frigive (free) node'rne inden du afslutter.
Avatar billede arne_v Ekspert
05. februar 2004 - 00:18 #2
Koden ligner meget noget jeg lavede til et spørgsmål engang tilbage
i oktober.
Avatar billede arne_v Ekspert
05. februar 2004 - 00:41 #3
Her er et eksempel med et array af dobbelt linkede lister:

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

struct node
{
  char *data;
  struct node *prev;
  struct node *next;
};

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

void print(struct node *first)
{
    struct node *curr;
    curr = first;
    while(curr!=NULL)
    {
        printf("this=%p prev=%p next=%p data=%s\n",curr,curr->prev,curr->next,curr->data);
        curr = curr->next;
    }
}

void xadd(struct node **first, int ix, char *data)
{
    add(&first[ix], data);
}

void xprint(struct node **first,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("list %d:\n",i);
        print(first[i]);
    }
}

int main()
{
    int i;
    struct node **first = (struct node **)malloc(6*sizeof(struct node *));
    for(i=0;i<6;i++) first[i]=NULL;
    xadd(first, 0, "a");
    xadd(first, 0, "bb");
    xadd(first, 0, "ccc");
    xadd(first, 2, "xxx");
    xadd(first, 2, "yy");
    xadd(first, 2, "z");
    xadd(first, 4, "1");
    xadd(first, 4, "2");
    xadd(first, 4, "3");
    xprint(first,6);
    return 0;
}
Avatar billede dragnor Juniormester
11. februar 2004 - 16:55 #4
cool tak
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