کد زیر را در ویژوال بیسیک یا هر کامپایلر دیگر می توانید کپی کنید و اجرا نمایید:
#include
#include
#include
#include
#include
#include
usingnamespacestd;
struct
Phone
{
charname[15];
charfamily[15];
chartel[12];
Phone*next;
};
Phone
*Start_ptr=NULL;
Phone
*current=NULL;
void
Select(int);// which choice user selected;
void
Add_new();
void
Print_all();
void
Menu1();
void
Menu2();
void
Edit_current();
void
Delete_current();
void
Delete_all();
void
Tel_or_name(int);
void
Read_from_file();
void
Write_to_file();
void
Sort_name(int);
void
Add_tail_from_file(Phone*);
Phone
*Search(char*,int);
enum
MENU{ADD=1,SEARCH_NAME,SEARCH_NO,SORT_NAME,SORT_FAMIL,SHOW_ALL,SAVE,EXPORT_CSV,EXIT,UNINSTALL};
int
main()
{
Read_from_file();
intchoice;
do
{
Menu1();
cin>>choice;
system("cls");
Select(choice);
}while(choice!=EXIT);
Write_to_file();
cout"Thank you"endl;
Delete_all();
return0;
}
/*===================Select=======================*/
void
Select(intchoose)
{
switch(choose)
{
caseADD:
Add_new(); break;
caseSEARCH_NAME:
Tel_or_name(1);break;
caseSEARCH_NO:
Tel_or_name(2);break;
caseSORT_NAME:
Sort_name(1); break;
caseSORT_FAMIL:
Sort_name(2); break;
caseSHOW_ALL:
Print_all(); break;
caseSAVE:
Write_to_file();
cout"We will save your data automatically when your work finished"endl;
getch();
break;
caseEXIT:
return;
default:
cout"Select again :"endl;
}
return;
}
/*=================Add_new=====================*/
void
Add_new()
{
Phone*temp=newPhone;
Phone*temp2=Start_ptr;
system("cls");
cout"Enter the name : ";
cin>>temp->name;
cout"Family : ";
cin>>temp->family;
cout"Phone number : ";
cin>>temp->tel;
temp->next=NULL;
if(Start_ptr==NULL)
{
Start_ptr=temp;
}
else
{
while(temp2->next!=NULL)
{
temp2=temp2->next;
}
temp2->next=temp;
}
return;
}
/*==============Print_all=======================*/
void
Print_all()
{
Phone*temp=Start_ptr;
charshow[35];
if(Start_ptr==NULL)
{
cout"The list is empty!"endl;
getch();
return;
}
else
{
cout"\nName Phone "
"\n----------------------------------- ------------"endl;
do
{
strcpy(show,"");
strcat(show,temp->family);
strcat(show,", ");
strcat(show,temp->name);
show[0]=toupper(show[0]);
coutsetiosflags(ios::left)
setw(36)showsetw(12)temp->telendl;
temp=temp->next;
}while(temp!=NULL);
}
coutendl;
getch();
return;
}
/*=================Search=======================*/
Phone
*Search(char*temp_search,intchoice)
{
/* If list is empty */
if(Start_ptr==NULL)
{
cout"List is empty!"endl;
returnNULL;
}
/* Search by name */
if(choice==1)
{
while(current!=NULL&&strcmp(current->name,temp_search)!=0)
{
current=current->next;
}
}
/* Search by tel */
if(choice==2)
{
while(current!=NULL&&strcmp(current->tel,temp_search)!=0)
{
current=current->next;
}
}
/* If record found */
if(current!=NULL)
{
cout"Record found"endl
current->name" "current->family" : "current->telendl;
returncurrent;
}
/* If record !found */
else
{
cout"Record NOT found"endl;
current=Start_ptr;//move back the current pointer to fisrt node
returnNULL;
}
}
/*====================Delete_current====================*/
void
Delete_current()
{
Phone*temp=NULL;
Phone*prev=NULL;
/* If it`s the fisrt node */
if(current==Start_ptr)
{
temp=Start_ptr;
Start_ptr=Start_ptr->next;//If we have only 1 node, start_ptr will point to NULL
deletetemp;
temp=NULL;
}
/* If it`s in the middle of list or the last node */
else
{
prev=Start_ptr;
while(prev->next!=current)
{
prev=prev->next;
}
prev->next=current->next;// If it`s the last node prev will point to NULL
deletecurrent;
current=Start_ptr;
}
}
/*=================Delete_all=================*/
void
Delete_all()
{
if(Start_ptr==NULL)
{
return;// we have no memory allocated
}
Phone*temp=Start_ptr;
while(Start_ptr!=NULL)
{
temp=Start_ptr;
Start_ptr=Start_ptr->next;
deletetemp;
}
}
/*=================Tel_or_name================*/
void
Tel_or_name(intchoose)
{
Phone*temp_del=NULL;
chartemp_search[15];
intchoice;
current=Start_ptr;
cout"Enter the "choose==1?"name":"tel")" to search : ";
cin>>temp_search;
temp_del=Search(temp_search,choose);
while(temp_del!=NULL)
{
Menu2();
cin>>choice;
switch(choice)
{
case1:current=current->next;temp_del=Search(temp_search,choose);break;
case2:Delete_current();break;
case3:Edit_current(); break;
case4:return;
}
}
getch();
}
/*==============Write_to_file=============================*/
void
Write_to_file()
{
Phone*temp=Start_ptr;
ofstreamoutFile("Data.dat",ios::out);
if(!outFile)
{
cerr"Some error ocured during writing to file."endl;
getch();
return;
}
while(temp!=NULL)
{
outFiletemp->name" "temp->family" "temp->tel;
if(temp->next!=NULL)
{
outFileendl;
}
temp=temp->next;
}
outFile.close();
cout"Data saved successfully."endl;
}
/*===============Read_from_file=============================*/
void
Read_from_file()
{
ifstreaminputFile("Data.dat",ios::in);
if(!inputFile)
{
cout"Data couldn`t be loaded."endl;
getch();
return;
}
do
{
Phone*temp=newPhone;
inputFile>>temp->name;
inputFile>>temp->family;
inputFile>>temp->tel;
temp->next=NULL;
Add_tail_from_file(temp);
//Where should I place delete temp?????
}while(!inputFile.eof());
cout"Data loaded successfully"endl;
}
/*==============Add_tail_from_file=================*/
void
Add_tail_from_file(Phone*temp)
{
if(Start_ptr==NULL)
{
Start_ptr=temp;
}
else
{
Phone*temp2=Start_ptr;
while(temp2->next!=NULL)
{
temp2=temp2->next;
}
temp2->next=temp;
}
}
/*================Sort_name=================================*/
void
Sort_name(intchoice)
{
/* If list is empty */
if(Start_ptr==NULL)
{
cout"The list is empty!"endl;
getch();
return;
}
/* Determine the size of list */
intcounter=1;
Phone*temp=Start_ptr;
while(temp->next!=NULL)
{
temp=temp->next;
counter++;
}
/* an Array of pointers to struct Phone. I couldn`t do this part by dynamic memory
allocation i.e Phone* sort = new Phone[counter]
or some thing like that. if you could help, please send me your suggestion .*/
Phone*sort[1000];
sort[0]=Start_ptr;
for(intcnt=1;cntcounter;cnt++)
{
sort[cnt]=sort[cnt-1]->next;
}
sort[counter]=NULL;
/* bubble sort */
/* This part could be better too.for example if user enter capital 'F' it comes
before 'a'. I had to change all letter to lower case but has no time. */
for(inti=0;icounter;i++)
{
for(intj=0;jcounter-i-1;j++)
{
/* Sort by name */
if(choice==1)
{
if(strcmp(sort[j]->name,sort[j+1]->name)>0)
{
Phone*temp2=sort[j];
sort[j]=sort[j+1];
sort[j+1]=temp2;
}
}
/* Sort by family */
else
{
if(strcmp(sort[j]->family,sort[j+1]->family)>0)
{
Phone*temp2=sort[j];
sort[j]=sort[j+1];
sort[j+1]=temp2;
}
}
}
}
/* Showing sorted list */
charshow[35];
intindex=0;
cout"\nName Phone "
"\n----------------------------------- ------------"endl;
do
{
strcpy(show,"");
strcat(show,sort[index]->family);
strcat(show,", ");
strcat(show,sort[index]->name);
show[0]=toupper(show[0]);
coutsetiosflags(ios::left)
setw(36)showsetw(12)sort[index]->telendl;
}while(sort[++index]!=NULL);
coutendl;
getch();
return;
}
/*====================Menu1=======================*/
void
Menu1()
{
system("cls");
cout"1. Add new phone"
"\n2. Search for name"
"\n3. Search for number"
"\n4. Sort by name"
"\n5. Sort by family"
"\n6. Show all list"
"\n7. Save data"
"\n9. Exit"
"\n\nYour choice : ";
}
/*====================Menu2=======================*/
void
Menu2()
{
cout"\n1. Find next"
"\n2. Delete current person"
"\n3. Edit current person"
"\n4. continue"endl
"\nYour choice : ";
}
void
Edit_current()
{
strcpy(current->name,"");
strcpy(current->family,"");
cout"Enter the name : ";
cin>>current->name;
cout"Family : ";
cin>>current->family;
cout"Phone number : ";
cin>>current->tel;
system("cls");
}
/*====================End=========================*/