Wednesday 25 June 2014

A database in C using a single linked list.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define MAX 10000
struct addr{
char name[40];
char street[40];
char district[40];
char town[40];
char county[40];
char country[40];
char postcode[40];
char telno[40];
char email[40];
struct addr *next;
};
typedef struct addr address;
address *temp, *start, *pointer,  *i= NULL;

void list(), createlist(void), add(void), addafter(void), deletion(void), search(void);
void save(), load(void), txtoutput(void);
void store();
void readLine(char buffer[]);
int main(void)
{
int choice;
for(;;){
printf("\n");
printf("1.  Create a list\n");
printf("2.  Add a record to the beginning of the list\n");
printf("3.  Add a record to the end of the list\n");
printf("4.  List the file\n");
printf("5.  Delete a record\n");
printf("6.  Save the file\n");
printf("7.  Save to a text file for output to a wp\n");
printf("8.  Search for a record\n");
printf("9.  Load the file\n");
printf("10. Quit\n");
do{
printf("\nEnter your choice: ");
scanf("%i",&choice);
getchar();
if(choice== 1) createlist();
if(choice==2) add();
if(choice==3) addafter();
if(choice==4) list();
if(choice==5) deletion();
if(choice==6) save();
if(choice==7) txtoutput();
if(choice==8) search();
if(choice==9) load();
if(choice== 10) exit(0);
}while(choice < 1 && choice >10);
}
return 0;
}



void add()
{
pointer = (address*) malloc(sizeof(address));

printf("Enter information on new customer\n");

printf("Enter name: ");
readLine(pointer->name);

printf("Enter street: ");
readLine(pointer->street);

printf("Enter district / parish: ");
readLine(pointer->district);

printf("Enter town / city: ");
readLine(pointer->town);

printf("Enter county: ");
readLine(pointer->county);

printf("Enter country: ");
readLine(pointer->country);

printf("Enter postcode: ");
readLine(pointer->postcode);

printf("Enter telephone number: ");
readLine(pointer->telno);

printf("Enter email pointer: ");
readLine(pointer->email);
pointer->next=start;
start=pointer;

}

void addafter()
{
pointer = (address*) malloc(sizeof(address));


printf("Enter information on new customer\n");

printf("Enter name: ");
readLine(pointer->name);

printf("Enter street: ");
readLine(pointer->street);

printf("Enter district / parish: ");
readLine(pointer->district);

printf("Enter town / city: ");
readLine(pointer->town);

printf("Enter county: ");
readLine(pointer->county);

printf("Enter country: ");
readLine(pointer->country);

printf("Enter postcode: ");
readLine(pointer->postcode);

printf("Enter telephone number: ");
readLine(pointer->telno);

printf("Enter email pointer: ");
readLine(pointer->email);
temp=start;
while(temp->next !=NULL)
temp=temp->next;
temp->next=pointer;
}

void list()
{

if(start==NULL)
printf("No records to view");
/*for (temp=start;temp!=NULL;temp=temp->next)*/
temp = start;
while(temp!=NULL)
{
printf("%s\n",temp->name);
printf("%s\n",temp->street);
printf("%s\n",temp->district);
printf("%s\n",temp->town);
printf("%s\n",temp->county);
printf("%s\n",temp->country);
printf("%s\n",temp->postcode);
printf("%s\n",temp->telno);
printf("%s\n",temp->email);
temp=temp->next;
}
}

void readLine(char buffer[])
{
char character;
int i=0;
do
{
character=getchar();
buffer[i]=character;
++i;
}
while(character !='\n');
buffer[i-1]='\0';
}

void createlist()
{
pointer = (address*) malloc(sizeof(address));


printf("Enter information on new customer\n");

printf("Enter name: ");
readLine(pointer->name);

printf("Enter street: ");
readLine(pointer->street);

printf("Enter district / parish: ");
readLine(pointer->district);

printf("Enter town / city: ");
readLine(pointer->town);

printf("Enter county: ");
readLine(pointer->county);

printf("Enter country: ");
readLine(pointer->country);

printf("Enter postcode: ");
readLine(pointer->postcode);

printf("Enter telephone number: ");
readLine(pointer->telno);

printf("Enter email pointer: ");
readLine(pointer->email);
pointer->next=NULL;
if(start==NULL)/*if list is empty*/
start=pointer;
else
{
/*add element to end of list*/
temp=start;
while(temp->next !=NULL)
temp=temp->next;
temp->next =pointer;
}
}
void save()
{
FILE *fp;
if((fp=fopen("maillist", "wb"))==NULL) {
printf("Cannot open file.\n");
return;
}
temp=start;
while(temp){
fwrite(temp,
sizeof(struct addr), 1, fp);
temp = temp->next;
}
fclose(fp);
}

void load()
{
FILE *fp;
if((fp=fopen("maillist", "rb"))==NULL) {
printf("Cannot open file,\n");
return;
}
start = ( address*) malloc(sizeof(address));
/*while(start){
temp=start->next;
free(temp);
start=temp;
}*/

free(start);
start=NULL;
while(!feof(fp)){

i = ( address*) malloc(sizeof(address));
temp = ( address*) malloc(sizeof(address));
if(!i){
printf("Out of memory.\n");
return;
}
if(1!=fread(i,sizeof(struct addr),1,fp))break;

if(start!=NULL)
{
temp = start;
while(temp->next!=NULL)
temp=temp->next;
i->next=NULL;
temp->next=i;
}
else
{
start=i;
i->next=NULL;
}
}
fclose(fp);
}

void txtoutput(void)
{
int t;
int count;
FILE *stream;
char filename[30];
count = 0;
printf("Enter a file name.\n");
scanf("%s",filename);
printf("\n");
stream = fopen(filename, "w+");
temp = start;
while(temp) {
count = count +1;
fprintf(stream,"%i\n",count);
fprintf(stream,"%s\n", temp->name);
fprintf(stream,"%s\n", temp->street);
fprintf(stream,"%s\n", temp->district);
fprintf(stream,"%s\n", temp->town);
fprintf(stream,"%s\n", temp->county);
fprintf(stream,"%s\n", temp->country);
fprintf(stream,"%s\n", temp->postcode);
fprintf(stream,"%s\n", temp->telno);
fprintf(stream,"%s\n", temp->email);
fprintf(stream,"\n");
temp=temp->next;
}
fclose(stream);
return;
}

void search()
{
int flag=0;
char name[40];
printf("Enter name of person to search for\n");
readLine(name);
temp=start;
while(temp)
{
if(strcmp(name, temp->name)==0)
{
printf("%s\n",temp->name);
printf("%s\n",temp->street);
printf("%s\n",temp->district);
printf("%s\n",temp->town);
printf("%s\n",temp->county);
printf("%s\n",temp->country);
printf("%s\n",temp->postcode);
printf("%s\n",temp->telno);
printf("%s\n",temp->email);
flag= 1;
}
temp=temp->next;
}
if(flag==0)
printf("Not found in list\n");
}

void deletion()
{
 address *t, *pt;
t = ( address*) malloc(sizeof(address));
pt = ( address*) malloc(sizeof(address));
char name[40];
if(start == NULL)
{
printf("List is empty\n");
return;
}
printf("Enter name of person to be deleted\n");
readLine(name);
if(strcmp(name,start->name)==0)
{
temp=start;
start = start->next;
free(temp);
return;
}
pt=start;
t=start->next;
while(t!=NULL&& strcmp(t->name,name)!=0)
{
pt =t;
t=t->next;
}
if(t==NULL)
{
printf("Record does not exist\n");
return;
}
if(strcmp(t->name,name)==0)
{
pt->next=t->next;
printf("Record is deleted\n");
free(t);
return;
}
}