这个很久以前就完成了,一直没贴出来。
这个同学录实际上就是通讯录,使用链表实现,也算是对链表的一种运用吧。
具体功能看Menu函数。
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct Student{ char name[20]; char tel[20]; char qq[20]; char address[20]; struct Student *next; }INFO; INFO *head; void Initiate();//初始化 void Menu ();//主菜单 void Add ();//添加联系人 void List ();//显示通讯录 void Alter();//修改 void Find ();//查找联系人 void Find_Name ();//按姓名查找 void Find_Tel ();//按学号查找 void Delate ();//删除联系人 void Delate_Name (); void Delate_Tel (); /* void Delate_Name ();//按姓名删除 void Delate_Tel ();//按电话删除 */ //初始化 void Initiate () { if((head=(INFO*)malloc(sizeof(INFO)))==NULL) exit(1); head->next=NULL; } //主菜单 void Menu() { printf ("\n"); printf ("\n"); printf ("\n"); printf("**************欢迎使用通讯录系统**************"); printf("\n"); printf("\n"); printf("*********** 1.添加好友 ***********\n"); printf("*********** 2.查询好友 ***********\n"); printf("*********** 3.修改好友 ***********\n"); printf("*********** 4.删除好友 ***********\n"); printf("*********** 5.显示所有好友 ***********\n"); printf("*********** 0.退通讯录 ***********\n\n\n"); } //添加通讯录好友 void Add() { INFO *p,*q; if ((q=(INFO *)malloc(sizeof(INFO)))==NULL) exit(1); printf("请输入要添加信息!\n"); printf("姓名:\n"); //添加信息 scanf("%s",&q->name); printf("电话号码:\n"); scanf("%s",q->tel); printf("QQ:\n"); scanf("%s",q->qq); printf("地址:\n"); scanf("%s",q->address); //保存聊天记录 FILE *file_in = fopen("同学录.txt", "w"); if (file_in == NULL) { perror("fopen TXT"); return ; } fprintf (file_in, "姓名:\t%s\t", q->name); fprintf (file_in, "号码:\t%s\t", q->tel); fprintf (file_in, "QQ:\t%s\t", q->qq); fprintf (file_in, "地址:\t%s\t", q->address); fclose (file_in); for (p = head;p->next!=NULL;p=p->next); p->next=q; q->next=NULL; printf("信息已添加完成!\n"); } //查找 void Find () { int i; printf ("\n\n\n\n\n\n**************************************\n"); printf ("\t\t1按姓名查找\n"); printf ("\t\t2按电话号码查找\n"); printf ("**************************************\n"); printf ("请选择:(按其他数字键返回!)"); scanf ("%d",&i); switch (i) { case 1: { Find_Name (); break; } case 2: { Find_Tel (); break; } } } void Find_Name () { INFO *p; char name[20]; if (head->next==NULL) // 如果是一个空链表; { printf("通讯录空!\n"); return; } printf("请输入要查找姓名:\n"); scanf("%s",&name); for (p=head->next;p!=NULL;p=p->next)//循环遍历链表中的节点,找出此时最小的节点 { if(strcmp(p->name,name)==0) { printf("姓名\t电话\tQQ\t地址\n"); printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address); } else if(p->next==NULL) { printf("没有该好友信息!\n"); } } } void Find_Tel () { INFO *p; char tel[20]; if (head->next==NULL)// 如果是一个空链表; { printf("通讯录空!\n"); return; } printf("请输入要查找电话号码:\n"); scanf("%s",&tel); for (p=head->next;p!=NULL;p=p->next)//循环遍历链表中的节点,找出此时最小的节点 { if(strcmp(p->tel,tel)==0) { printf("姓名\t电话\tQQ\t地址\n"); printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address); } else if(p->next==NULL) { printf("没有该好友信息!\n"); } } } //修改通讯录信息 void Alter() { char name [50]; //先查找 INFO *p,*p1; if(head->next==NULL) { printf("通讯录空!\n"); return; } printf("请输入要修改姓名:\n"); scanf("%s",name); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->name,name)==0) { break; } else if(p->next==NULL) { printf("信息!\n"); return; } } p1=(INFO *)malloc(sizeof(INFO)); printf("new姓名:\n"); //添加信息 scanf("%s",p1->name); strcpy(p->name,p1->name); printf("new电话号码:\n"); scanf("%s",p1->tel); strcpy(p->tel,p1->tel); printf("newQQ:\n"); scanf("%s",p1->qq); strcpy(p->qq,p1->qq); printf("new地址:\n"); scanf("%s",p1->address); strcpy(p->address,p1->address); printf("信息已修改\n"); //显示修改信息 printf("姓名\t电话\tQQ\t地址\n"); printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address); free(p1); } //删除通讯录信息 void Delate() { int i; printf ("\n\n\n\n\n\n**************************************\n"); printf ("\t\t1按姓名删除\n"); printf ("\t\t2按电话号码删除\n"); printf ("**************************************\n"); printf ("请选择:(按其他数字键返回!)"); scanf ("%d",&i); switch (i) { case 1: { Delate_Name (); break; } case 2: { Delate_Tel (); break; } } } void Delate_Name() { char name[20]; //先查找 删除 INFO *p = head->next, *p1 =head->next,*p2; if (head->next == NULL) { printf("通讯录空\n"); return; } printf("请输入要删除姓名:\n"); scanf(" %s",name); while ((strcmp(p->name,name)!=0 )&& p->next != NULL) { p1=p; p =p->next; } if (strcmp(name, p->name)==0) //输删除信息 { if (p == head->next&&p->next!=NULL) { head->next = p->next; } else if(p==head->next&&p->next==NULL) { head->next=p->next; printf("好友已全部删除!\n"); return; } else p1->next = p->next; } else { printf("不存在该好友!\n"); return; } printf("信息已删除!\n"); printf("您还有以下好友!\n"); printf("姓名\t电话号码\tQQ\t地址\n"); for(p2=head->next;p2!=NULL;p2=p2->next) printf("%s\t%s\t%s\t%s\n",p2->name,p2->tel,p2->qq,p2->address); } void Delate_Tel() { char tel[20]; //先查找 删除 INFO *p = head->next, *p1 =head->next,*p2; if (head->next == NULL) { printf("通讯录空\n"); return; } printf("请输入要删除电话号码:\n"); scanf(" %s",tel); while ((strcmp(p->tel,tel)!=0 )&& p->next != NULL) { p1=p; p =p->next; } if (strcmp(tel, p->tel)==0) //输删除信息 { if (p == head->next&&p->next!=NULL) { head->next = p->next; } else if(p==head->next&&p->next==NULL) { head->next=p->next; printf("好友已全部删除!\n"); return; } else p1->next = p->next; } else { printf("不存在该好友!\n"); return; } printf("信息已删除!\n"); printf("您还有以下好友!\n"); printf("姓名\t电话号码\tQQ\t地址\n"); for(p2=head->next;p2!=NULL;p2=p2->next) printf("%s\t%s\t%s\t%s\n",p2->name,p2->tel,p2->qq,p2->address); } //显示所记录 void List() { INFO *p; if(head->next==NULL) { printf("通讯录记录!\n"); return; } printf("姓名\t电话号码\tQQ\t地址\n"); for(p=head->next;p!=NULL;p=p->next) printf("%s\t%s\t\t%s\t%s\n",p->name,p->tel,p->qq,p->address); } int main() { int choice; char yes_no; Initiate(); do { Menu(); printf("请输入指令0-5:\n"); scanf("%d",&choice); printf("\n"); switch(choice) { case 1:Add(); break; case 2:Find(); break; case 3:Alter(); break; case 4:Delate(); break; case 5:List(); break; case 0: printf("************谢您使用************\n"); exit(0); //正常退出 break; default: printf("输入误!请重新输入\n"); break; } printf("是否继续 Y or N? \n"); do { scanf("%c",&yes_no); } while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n'); } while(yes_no=='Y'||yes_no=='y'); }