Kodi PHP:
#include <stdlib.h>
#include <stdio.h>
/*
Keshillohet qe per arsye te vizualizimit korrekt dhe pa shtremberime te
tabeles me te dhenat e listes dritarja(console) e programit te kete
nje gjeresi te bollshme prej 110-120 germa
*/
/*
* ne baze te sistemit operativ percaktojme komanden per te fshire ekranin
* per fat te keq nuk ka asnje standart per te kryer kete veprim ne menyre
* te thjeshte dhe te pavarur nga platforma
* nese kemi te bejme me WINDOWS komanda eshte "cls"
* perndryshe perdorim komanden "clear" per sistemet UNIX(Linux,Solaris,MacOS,etj..).
* Komandat e sistemit(prompt) ekzekutohen nepermjet funksionit system()
*
*/
//per windows
const char* pastro_ekranin = "cls";
//per sistemet unix like
//const char* pastro_ekranin = "clear";
//komandat
char* cmd_shto="shto";
char* cmd_shiko="shiko";
char* cmd_modifiko="modifiko";
char* cmd_fshi="fshi";
char* cmd_fshi_listen="rifillo";
char* cmd_ruaj_skedar="ruaj";
char* cmd_lexo_skedar="lexo";
char* cmd_dil="dil";
//Struktura qe permban informacionet mbi personin si dhe nje fushe teper qe
//permban nje pointer per tek nje element tjeter i tipit person.
struct list_element {
char emri[40]; //maksimumi 40 germa
char mbiemri[40];//maksimumi 40 germa
char email[40]; //maksimumi 40 germa
char telefoni[16]; //maksimumi 16 germa(shifra)
char adresa[60]; //maksimumi 60 germa
struct list_element* next; //pointer per tek elementi i rradhes
};
//krijojme tipin e ri "person"
typedef struct list_element person;
//per lehtesi krijojme edhe tipin pointer per strukturen person
typedef person* p_person;
/*
funksion qe krijon nje element te ri dhe na jep referimin(pointer) e struktures
funksioni "malloc()" rezervon nje hapesire ne memorie me aq byte sa eshte
madhesia e struktures person, qe ne rastin tone eshte shuma e madhesive te
elementeve te saj struktura nuk eshte asgje tjeter veç se nje array
heterogjen ku elementet jane te tipeve dhe madhesive te ndryshme.
Kjo hapesire ne fillim eshte e pa tipizuar, pra e tipit "void" keshtu
qe bejme konvertim te tipit nga void ne p_person.
Funksioni kthen nje pointer qe referon kete hapesire memorie bosh qe
pret te mbushet me te dhena
*/
p_person krijoElementTeRi(){
return ((p_person)malloc(sizeof(person)));
}
/*
funksion qe mbush me te dhena te marra nga inputi elementin personi.
nese update eshte 1 atehere funksioni kryen modifikimin e nje elementi
qe ka te dhena. Nese futen te dhena per nje element te caktuar gjate
modifikimit atehere funksioni e modifikon fushen, ne te kundert
nuk e modifikon duke lene vleren qe kishte.
*/
void mbusheElementinNgaInput(p_person personi,int update){
//string ndihmese e perkoheshme ku do te marrim input
char temporary[60];
printf("Shkruaj emrin: ");
gets(temporary); //marr input
if(update){
if(strlen(temporary)!=0){
//kopjoj tek fusha vleren e "temporary"
strcpy(personi->emri,temporary);
}
}else{
strcpy(personi->emri,temporary);
}
printf("Shkruaj mbiemrin: ");
gets(temporary); //marr input
if(update){
if(strlen(temporary)!=0){
//kopjoj tek fusha vleren e "temporary"
strcpy(personi->mbiemri,temporary);
}
}else{
strcpy(personi->mbiemri,temporary);
}
printf("Shkruaj adresen email: ");
gets(temporary); //marr input
if(update){
if(strlen(temporary)!=0){
//kopjoj tek fusha vleren e "temporary"
strcpy(personi->email,temporary);
}
}else{
strcpy(personi->email,temporary);
}
printf("Shkruaj telefonin: ");
gets(temporary); //marr input
if(update){
if(strlen(temporary)!=0){
//kopjoj tek fusha vleren e "temporary"
strcpy(personi->telefoni,temporary);
}
}else{
strcpy(personi->telefoni,temporary);
}
printf("Shkruaj adresen: ");
gets(temporary); //marr input
if(update){
if(strlen(temporary)!=0){
//kopjoj tek fusha vleren e "temporary"
strcpy(personi->adresa,temporary);
}
}else{
strcpy(personi->adresa,temporary);
}
}
//afishon listen
void afishoListen(p_person lista) {
int i;
//perdorim nje variable qe e nisim me vleren e elementit te pare te listes
p_person iterator=lista;
if(iterator==NULL){
printf("Lista eshte bosh\n");
} else {
printf("%-15s %-15s %-25s %-20s %-35s\n","Emri","Mbiemri","E-Mail","Telefoni","Adresa");
for(i=0;i<110;i++) printf("-");
printf("\n");
while(iterator!=NULL){ //per sa kohe elementi nuk eshte null
printf("%-15s %-15s %-25s %-20s %-35s\n",iterator->emri,iterator->mbiemri,iterator->email,iterator->telefoni,iterator->adresa);
//spostohemi tek elementi i rradhes
iterator=iterator->next;
}
}
printf("\n");
}
//fshin element
void fshiElement(p_person element){
printf("Elementi qe do te fshihet eshte %s %s\n", element->emri, element->mbiemri);
free(element);
}
//fshin listen
void fshilist(p_person lista) {
p_person aux; //auxiliary variable, ndryshore ndihmese
p_person iterator=lista;
while (iterator != NULL) {
aux = iterator-> next; //shpetojme next
fshiElement(iterator); //fshijme elementin e tanishem
iterator=aux; //elementi qe ishte next tani eshte i pari
}
}
/*
Funksioni qe gjen nje element dhe e fshin nga lista
gjithashtu kthen listen e modifikuar
*/
p_person gjejDheFshi(p_person lista, char* emri, char* mbiemri){
p_person iterator=lista;
p_person prev=iterator; //ketu do te shpetojme elementin para-ardhes
p_person ret_value; //vlera qe do te permbaje listen e re
while(iterator!=NULL){
//nese elementi i tanishem ka emrin=emri dhe mbiemrin=mbiemer
if(strcmp(emri,iterator->emri)==0 && strcmp(mbiemri,iterator->mbiemri)==0){
if(prev==NULL){ //nese ky eshte elementi i pare
ret_value=iterator->next;
fshiElement(iterator);
return ret_value;
}else{
prev->next=iterator->next; //lidhim elementin para-ardhes me ate pas-ardhes
fshiElement(iterator);
return lista; //koka e listes eshte po e njejta prandaj kthejme vete listen
}
}else{
prev=iterator;
iterator=iterator->next;
}
}
//nese nuk e ka gjetur elementin qe permban ato te dhena thjesht kthjejme listen
return lista;
}
/*
Funksioni qe gjen nje element sipas emrit dhe mbiemrit dhe modifikon te dhenat
*/
void gjejDheModifiko(p_person lista, char* emri, char* mbiemri){
p_person iterator=lista;
while(iterator!=NULL){
//nese elementi i tanishem ka emrin=emri dhe mbiemrin=mbiemer
if(strcmp(emri,iterator->emri)==0 && strcmp(mbiemri,iterator->mbiemri)==0){
mbusheElementinNgaInput(iterator,1);
return;
}else{
iterator=iterator->next;
}
}
}
/*
Funksioni qe shton nje element te ri ne liste
*/
p_person shtoElement(p_person lista, p_person element){
p_person iterator=lista;
//elementi i fundit duhet te kete patjeter fushen "next" NULL
element->next=NULL;
//nese lista eshte bosh atehere elementi behet vete lista
if(lista==NULL) return element;
//shkojme deri tek elementi i fundit
while(iterator->next!=NULL) iterator=iterator->next;
iterator->next=element;
return lista;
}
void ruajListenNeSkedar(p_person lista){
FILE *skedari;
char emri_skedarit[25];
p_person iterator=lista;
if(iterator==NULL){
printf("Lista eshte bosh, nuk mund t'a ruaj ne skedar!\n");
} else {
printf("Shkruaj emrin e skedarit ne te cilin do te ruash te dhenat:\n");
gets(emri_skedarit); //marrim ne input emrin e skedarit
//hapim skedarin ne binary mode me te drejta shkrimi
//nese skedari nuk ekziston do te krijohet automatikisht
skedari=fopen(emri_skedarit,"wb");
while(iterator!=NULL){ //per sa kohe elementi nuk eshte null
/*
* shkruajme ne skedar te gjithe elementin
* parametri i pare eshte nje pointer i nje array te tipit void
* pra i pergjithshem
* parametri i dyte eshte madhesia ne byte e nje elementi te array
* ne rastin tone nje element eshte nje byte, pra madhesia eshte 1
* parametri i trete eshte numri i elementeve te array
* ne rastin tone eshte madhesia ne byte e struktures "list_element"
* parametri i katert eshte skedari
*/
fwrite(iterator,1,sizeof(struct list_element),skedari);
//spostohemi tek elementi i rradhes
iterator=iterator->next;
}
//me anen e ketij funksioni detyrojme sistemin qe te shkruaje te dhenat
//fizikisht ne disk, zakonisht per skedare te vegjel sistemi vonon
//shkrimin ne disk per te mos degraduar performancen e sistemit
fflush(skedari);
//mbyllim skedarin
fclose(skedari);
}
}
p_person lexoListenNgaSkedari(){
p_person personi,lista=NULL;
FILE *skedari;
int size;
char emri_skedarit[25];
printf("Shkruaj emrin e skedarit nga i cili do te lexosh te dhenat:\n");
gets(emri_skedarit); //marrim ne input emrin e skedarit
//hapim skedarin ne binary mode me te drejta leximi
skedari=fopen(emri_skedarit,"rb");
//nje teknike per te kontrolluar madhesine e skedarit
fseek(skedari,0,SEEK_END); //pozicionohemi ne fund te skedarit
size=ftell(skedari); //kjo na jep pozicionin , rrjedhimisht madhesine e skedarit
fseek(skedari,0,SEEK_SET); //ripozicionohemi ne fillim gati per te lexuar
if(size==0){
printf("Skedari eshte bosh, nuk mund t'a lexoj kete skedar!\n");
}
//nese madhesia e dosjes nuk eshte nje shumefish i madhesise se struktures
//atehere skedari nuk eshte i vlefshem
else if(size%sizeof(struct list_element)!=0){
printf("Skedari nuk eshte i vlefshem!\n");
} else {
while(ftell(skedari)<size){ //per sa kohe nuk kemi arritur fundin e skedarit
printf("po krijoj nje element te ri\n");
//krijo nje element te ri bosh
personi=krijoElementTeRi();
/*
* lexojme nga skedari sizeof(struct list_element) byte
* qe kopjohen tek struktura personi
* parametri i dyte eshte madhesia ne byte e nje elementi te array
* ne rastin tone nje element eshte nje byte, pra madhesia eshte 1
* parametri i trete eshte numri i elementeve te array
* ne rastin tone eshte madhesia ne byte e struktures "list_element"
* parametri i katert eshte skedari
*/
fread(personi,1,sizeof(struct list_element),skedari);
//shtojme elementin tek lista
lista=shtoElement(lista,personi);
}
//mbyllim skedarin
fclose(skedari);
}
return lista;
}
//test
int main(){
p_person lista=NULL;
p_person personi;
char emri[40],mbiemri[40],komanda[10]; //input per te gjetur elementet
//cikel infinit deri sa te jet dhene komanda e daljes
while(1){
printf("<komanda>");
gets(komanda);
if(strcmp(komanda,cmd_shto)==0) {
personi=krijoElementTeRi();
mbusheElementinNgaInput(personi,0);
lista=shtoElement(lista,personi);
system(pastro_ekranin);
afishoListen(lista);
} else if(strcmp(komanda,cmd_shiko)==0) {
system(pastro_ekranin);
afishoListen(lista);
} else if(strcmp(komanda,cmd_modifiko)==0) {
system(pastro_ekranin);
printf("Shkruaj emrin dhe mbiemrin e elementit qe do te modifikosh!\n");
printf("Emri:");
gets(emri);
printf("Mbiemri:");
gets(mbiemri);
printf("Shkruaj te dhenat e reja te fushave, ose thjesht 'ENTER' per te mos modifikuar nje fushe!\n");
gjejDheModifiko(lista,emri,mbiemri);
system(pastro_ekranin);
afishoListen(lista);
} else if(strcmp(komanda,cmd_fshi)==0) {
system(pastro_ekranin);
printf("Shkruaj emrin dhe mbiemrin e elementit qe do te fshish!\n");
printf("Emri:");
gets(emri);
printf("Mbiemri:");
gets(mbiemri);
gjejDheFshi(lista,emri,mbiemri);
system(pastro_ekranin);
afishoListen(lista);
}else if(strcmp(komanda,cmd_fshi_listen)==0) {
fshilist(lista);
system(pastro_ekranin);
} else if(strcmp(komanda,cmd_ruaj_skedar)==0) {
system(pastro_ekranin);
ruajListenNeSkedar(lista);
system(pastro_ekranin);
} else if(strcmp(komanda,cmd_lexo_skedar)==0) {
lista=lexoListenNgaSkedari();
afishoListen(lista);
} else if(strcmp(komanda,cmd_dil)==0) {
//dil nga cikli duke dale nga programi
break;
} else {
system(pastro_ekranin);
printf(" Komandat jane:\n");
printf("--------------------------------------------\n");
printf("shto -> Shto nje rekord te ri ne liste.\n");
printf("shiko -> Vizualizo listen.\n");
printf("modifiko-> Modifiko nje rekord.\n");
printf("fshi -> Fshi nje rekord.\n");
printf("ruaj -> Ruaj listen ne nje skedar.\n");
printf("lexo -> Lexo listen nga nje skerar.\n");
printf("rifillo -> Fshi te gjithe listen.\n");
printf("dil -> Dil nga programi.\n");
}
}
}
Krijoni Kontakt