Vissza

Láncolt listák


1. Készítsünk egy egyszeresen láncolt lista programmodult. A modul tesztelésére állományban levő karakterláncokkal töltsünk fel egy listát, majd adott karakterláncokat töröljünk a listából. Az új elemet mindig az aktuális elem után szúrjuk be. A törlendő elem pedig  mindig az aktuális utáni elem legyen.

Az alábbi forráskód egész számokat szúr be egy egyszeresen láncolt lista végére, majd kiírja a lista tartalmát:
1. módszer (egyszerűbb verzió, csak egy struktúrával dolgozunk)

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

struct item{
    int number;
    struct item *next;
};

typedef struct item  * ITEM;

ITEM insertAfter(ITEM act, ITEM elem);
ITEM createItem( int key);
void destroy (ITEM act);

int main()
{
    ITEM elem, head, act;
    int tomb [] = {1, 2, 3, 4, 5, 6};
    int i, e;

    head = act = NULL;
    for (i = 0; i < 6; i++)
    {
        elem = createItem (tomb[i]);
        act = insertAfter (act, elem);
        if(head == NULL) head = act;
    }
    printf("\n\n");
    act = head;
    while( act!= NULL )
    {
        e = act->number;
        printf("%i  ",e);
        act = act->next;
    }
    printf("\n\n");
    destroy (act);
    return 1;
}

void destroy (ITEM act){
    ITEM elem;
    while (act != NULL){
        elem = act;
        act = act -> next;
        free (elem);
    }
}

ITEM insertAfter(ITEM act, ITEM elem){
    if (act == NULL){
        act = elem;
    }

    else {
        act -> next = elem;
        act = elem;
    }
    return act;
}

ITEM createItem( int key){
    ITEM elem = (ITEM) malloc( sizeof( struct item));  
    elem->number = key;
    elem->next= NULL;
    return elem;

2. módszer (a lista fej és aktuális elemeinek a kezelésére két struct típussal dolgozunk

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

struct item{
    int number;
    struct item *next;
};

struct list{
    struct item *head, *act;
    int size;
};

typedef struct item  * ITEM;
typedef struct list * LIST;

ITEM createItem( int key); // egy elem helyfoglalása
LIST create(); //a lista helyfoglalas
void destroy( LIST ); // a lista felszabadtása;
void insertAfter(LIST L, ITEM elem); //beszúras az akutuális mögé, ez nincs megírva!!!
int getValue(LIST L); //az aktuális elem kulcsértékének lekérdezése
int isLast(LIST L); //az aktuális elem utolsó-e a listában
int setFirst(LIST L); // az aktuális elemet "fej"-nek állítjuk
void next(LIST L); //az aktuális elem, következő elemre való állítása

int main()
{
    LIST L;
    ITEM elem;
    int tomb[4] = {1,2,3,4};
    int i, e;
    L = create();
    for(i=0; i<4; ++i)
    {
        elem = createItem(tomb[i]);
        insertAfter(L, elem);
    }
    printf("\n\n");
    setFirst(L);
    while(!isLast(L))
    {
        e = getValue(L);
        printf("%i  ",e);
        next(L);
    }
    printf("\n\n");
    destroy (L);
    return 1;
}

void next(LIST L){
    L->act=L->act->next;
}

int getValue(LIST L){
    return L->act->number;

}

int isLast(LIST L){
    if(L->act == NULL) return 1;
    else return 0;
}

int setFirst(LIST L){
    L->act = L->head;
    return 1;
}

ITEM createItem( int key){
    ITEM elem = (ITEM) malloc( sizeof( struct item));   
    elem->number = key;
    elem->next= NULL;
    return elem;
}

LIST create()
{
    LIST L;
    L=(LIST)malloc(sizeof(struct list));
    L->head = L->act = NULL;
    L->size = 0;
    return L;
}

void destroy( LIST L){
    ITEM elem;
    while( L->head != NULL ){
        elem = L->head;
        L->head = L->head->next;
        free( elem );
    }
}