一个通讯录的C语言代码时间:2025-04-24 22:43:07/* 09年3月8号 A simple mailing list program that illustrates the use and maintence of doubly linked lists. */ #include <> #include <> #include <> struct address{ char name[30]; char street[40]; char city[20]; char state[3]; char zip[11]; struct address *next; /* pointer to next entry */ struct address *prior; /* pointer to previous record */ }; struct address *start; /* pointer to first entry in list */ struct address *last; /* pointer to last entry */ struct address *find(char*); void enter(void),search(void),save(void); void load(void),list(void); void mldelete(struct address **,struct address **); void dls_store(struct address *i,struct address **start,struct address **last); void inputs(char *,char *,int); void display(struct address *); int menu_select (void); int main(void) { start = last = NULL; /* initialize start and end pointers */ for(;;){ switch(menu_select()){ case 1: enter (); /* enter an address */ break; case 2: mldelete(&start,&last); /* remove an address */ break; case 3: list(); /* display the list */ break; case 4: search(); /* find an address */ break; case 5: save(); /* save list to disk */ break; case 6: load(); /* read from disk */ break; case 7: exit(0); } } return 0; } /* Select an operation. */ int menu_select(void) { char s[80]; int c; printf(" a name /n"); printf(" a name /n"); printf(" the file /n"); printf(" /n"); printf(" the file /n"); printf(" the file /n"); printf(" /n"); do { printf("/n Enter your choice:"); gets(s); c = atoi(s); }while(c<0||c>7); return c; } /* Enter names and address. */ void enter(void) { struct address *info; for(;;){ info= (struct address *)malloc(sizeof(struct address)); if(!info){ printf("/n out of memory"); return; } inputs("Enter name:", info->name,30); if(!info->name[0]) break; /* stop entering */ inputs("Enter street:",info->street,40); inputs("Enter city:",info->city,20); inputs("Enter state:",info->state,3); inputs("Enter zip:",info->zip,10); dls_store(info,&start,&last); } /* entry loop */ } /* This function will input a string up to the length in count and will prevent the string from being overrun . It will also display a prompting message. */ void inputs(char *prompt,char *s,int count) { char p[255]; do { printf(prompt); fgets(p,254,stdin); if(strlen(p) > (unsigned int)count) printf("/n Too Long /n"); }while(strlen(p) > (unsigned int)count); p[strlen(p)-1] = 0; // remove newline charater strcpy(s,p); } /* Create a doubly linked list in sorted order. */ void dls_store( struct address *i, /* new element */ struct address **start, /* firsr element in list */ struct address **last /* last element in list */ ) { struct address *old,*p; if(*last == NULL){ /* first element in list */ i->next = NULL; i->prior = NULL; *last = i; *start = i; return; } p = *start; /* start at top list */ old = NULL; while (p){ if (strcmp(p->name,i->name)<0){ old = p; p = p->next; } else { if(p->prior){ p->prior->next = i; i->next = p; i->prior = p->prior; p->prior = i; return; } i->next = p; /* new first element */ i->prior = NULL; p->prior = i; *start = i; return ; } } old->next = i; /* put on old */ i->next = NULL; i->prior = old; *last = i; } /* Remove an element from the list. */ void mldelete(struct address **start,struct address **last) { struct address *info; char s[80]; inputs("Enter name:",s,30); info = find(s); if(info){ if(*start == info){ *start = info->next; if(*start)((*start)->prior) = NULL; else *last = NULL; } else{ info->prior->next = info->next; if(info!=*last) info->next->prior = info->prior; else *last = info->prior; } free(info); /* return memory to system */ } } /* Find an address. */ struct address *find(char *name) { struct address *info; info = start; while (info){ if(!strcmp(name,info->name))return info; info = info->next; /* get next address */ } printf("Name not found. /n"); return NULL; /* not found */ } /* Display the entire list. */ void list(void) { struct address *info; info = start; while(info){ display(info); info = info->next; /* get next address */ } printf("/n /n"); } /* This function actually prints the fields in each address. */ void display(struct address *info) { printf("%s /n",info->name); printf("%s /n",info->street); printf("%s /n",info->city); printf("%s /n",info->state); printf("%s /n",info->zip); printf("/n /n"); } /* Look for a name in the list. */ void search(void) { char name[40]; struct address *info; printf("Enter name to find:"); gets(name); info = find(name); if (!info)printf("Not Found /n"); else display(info); } /* Save the file to disk */ void save(void) { struct address *info; FILE *fp; fp = fopen("","wb"); if(!fp){ printf("Cannot open file. /n"); exit(1); } printf("/n Saving File /n"); info = start; while(info){ fwrite(info,sizeof(struct address),1,fp); info = info->next; /* get next address */ } fclose(fp); } /* Load the address file. */ void load() { struct address *info; FILE *fp; fp = fopen("","rb"); if(!fp){ printf("Cannot open file./n"); exit(1); } /* free any previously allocated memory */ while (start){ info = start->next; free(info); start = info; } /* reset top bottom pointers */ start = last = NULL; printf("/n Loading File /n"); while(!feof(fp)){ info = (struct address *)malloc(sizeof(struct address)); if(!info){ printf("Out of Memory"); return; } if(1 != fread(info,sizeof(struct address),1,fp))break; dls_store(info,&start,&last); } fclose(fp); }