Çift Yönlü Bağlı Liste Tasarlanması

Evet arkadaşlar çift yönlü bağlı liste tasarlayacağız.Bağlı listenin ne olduğu, nerelerde kullanıldığı hakkında genel bilgisi olan arkadaşların işine yarayabiliceğini düşünüyorum.

Kaynak kod dosyası aşağıdaki gibidir.

#include
#include
#include

//macro tanımları

#define MoveNextPers(lpPers) (lpPers->Next)
#define MoveBackPers(lpPers) (lpPers->Previous)
typedef struct tagPERS
{
    char Name[10];
    char Surname[10];
    struct tagPERS *Next;
    struct tagPERS *Previous;
} PERS,*LPPERS;/*Bagli liste olsuturulacak yapimiz Next ve Previous elemanları sırasıyla bir sonraki ve bir önceki yapı adresini tutucak.*/

LPPERS gHead = NULL;

//fonksiyon prototipleri

void SetPers(LPPERS Personel);
LPPERS CreateAddPers(void);
void DisplayPers(LPPERS lpPers);
BOOL DeletePers(LPPERS lpPers);
BOOL InsertPers(LPPERS lpPers);
void DispAll(void);

int main(int argc, char *argv[])
{
    while(TRUE)
    {
        printf( "Add Personel\t\t:1\n"\
                "Display Personel\t:2\n"\
                "Manual Move\t\t:3\n");
        switch(getch())
        {
            case '1':
                CreateAddPers();
                break;
            case '2':
                DispAll();
                break;
            case '3':
            {
                LPPERS MovePers = gHead;
                while(TRUE){
                printf( "Move Next\t:1\n"\
                        "Move Back\t:2\n"\
                        "On Struct\t:3\n"\
                        "On StructDel\t:4\n"\
                        "On StructIns\t:5\n"\
                        "Main Menu\t:6\n");
                switch(getch()){
                    case '1':
                        if(MovePers != NULL)
                            if(MoveNextPers(MovePers) !=
NULL)
                            {
                                MovePers =
MoveNextPers(MovePers);
                                DisplayPers(MovePers);
                            }
                        else
                            printf("Don't moving next..\n");
                        break;
                    case '2':
                        if(MovePers != NULL)
                            if(MoveBackPers(MovePers) !=
NULL)
                            {
                                MovePers = MoveBackPers(MovePers);
                                DisplayPers(MovePers);
                            }
                        else
                            printf("Don't moving
previous..\n");
                        break;
                    case '3':
                        DisplayPers(MovePers);
                        break;
                    case '4':
                        if(DeletePers(MovePers))
                           
printf("\n*Deleted*\n");
                        else
                            printf("\n*Doesn't
delete\n");
                        break;
                    case '5':
                        if(InsertPers(MovePers))
                        {
                           
printf("\n*Inserted*\n");
                            MovePers =
MoveNextPers(MovePers);
                        }
                        else
                            printf("\n*Doesn't
insert*\n");
                        break;
                    case '6':goto EXIT;
                    default:
                        printf("\nInvalid Option
!!!\n");
                    }
                }
                EXIT:
                break;
            }
            default:
                exit(1);
        }
    }
}
void SetPers(LPPERS Personel)
{
    printf("Name : ");
    gets(Personel->Name);
    printf("Surname : ");
    gets(Personel->Surname);
}
LPPERS CreateAddPers(void)
{
    LPPERS Personel = (LPPERS) malloc( sizeof(PERS) );
    SetPers(Personel);
   
        Personel->Previous = gHead;
        Personel->Next = NULL;
        if(gHead != NULL)
            gHead->Next=Personel;
    gHead = Personel;
    return Personel;
}
void DisplayPers(LPPERS lpPers)
{
    printf("\nName : %s ,, Surname :
%s\n",lpPers->Name,lpPers->Surname);
}
BOOL DeletePers(LPPERS lpPers)
{
    if(lpPers == NULL)
        return FALSE;
    if(lpPers->Next == NULL &&
lpPers->Previous == NULL)
         gHead = NULL;
    else if(lpPers->Next == NULL)
        (lpPers->Previous)->Next = NULL;
    else if(lpPers->Previous == NULL)
        (lpPers->Next)->Previous = NULL;
    else
    {
        (lpPers->Previous)->Next = lpPers->Next;
        (lpPers->Next)->Previous =
lpPers->Previous;
    }
   
    free(lpPers);
    return TRUE;
}
BOOL InsertPers(LPPERS lpPers)
{
    if(lpPers == NULL)
        return FALSE;
    LPPERS Personel = (LPPERS) malloc( sizeof(PERS) );
    SetPers(Personel);
   
        Personel->Next = lpPers->Next;
        if(lpPers->Next != NULL)
            (lpPers->Next)->Previous = Personel;
        lpPers->Next = Personel;
   
    Personel->Previous = lpPers;
}
void DispAll(void)
{
    if(gHead == NULL)
    {
        printf("Don't display.\n");
        return;
    }
    LPPERS lpPers;
    for(lpPers = gHead;lpPers->Previous != NULL
&& lpPers != NULL;lpPers = MoveBackPers(lpPers))
        DisplayPers(lpPers);
    DisplayPers(lpPers);
}

Bu konu üzerinde anlatılıcak pek fazla bişey yok ve gereksiz açıklamalar kodun anlaşılabilirliğini azaltıcaktır..Zaten C’ye yeni başlayan adamın bağlı liste ile işi ne, değil mi ?

Internet üzerinde Türkçe olarak çift yönlü bağlı liste tasarımı görmediğimden dolayı bu tasarımı yaptım.Bu konudan önce bağlı listeleri ve bağlı liste uygulamalarını incelemek konuyu kavramada yardımcı olucaktır.

Tarih:
Hit: 2959
Yazar: guru



Yorumlar


Siftahı yapan siz olun
Yorum yapabilmek için üye girişi yapmalısınız.