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;
#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.