数据结构的第二个课程设计,在c语言课程设计的基础上加以改进,(加强版),保存一下代码,对文件的处理,还是有一点一问题,还有待改进
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h>/*屏幕操作函数库*/ struct node { int num; //编号 char name[10];//姓名 char addr[20];//地址 char telenum[20];//电话号码 }; typedef node telebook; struct Lnode { telebook data; Lnode *next; }; typedef Lnode Link; Link *L;//创建头节点 void Find_Num(Link *L); void Find_Name(Link *L); void Find_Tel(Link *L); void DestoryLink(Link *L); Link *CreatLink(Link* L)//创建 { Link *q,*p; FILE *fp; char flag='y'; int i=0; L=(Link *)malloc(sizeof(Link)); //创建头节点 q=L;//尾指针指向头指针 if((fp=fopen("telebook.txt","ab+"))==NULL)/* 若读写打开二进制文件telebook.txt失败,则显示出错信息 */ { printf("打开文件有误!"); exit(0); } while(flag=='y') { p=(Link *)malloc(sizeof(Link)); printf("录入信息:\n"); printf("编号:\n"); scanf("%d",&p->data.num); printf("姓名:\n"); scanf("%s",p->data.name); printf("地址:\n"); scanf("%s",p->data.addr); printf("电话号码:\n"); scanf("%s",p->data.telenum); q->next=p; q=p; printf("继续添加?(y/n)\n"); scanf("%s",&flag); while(flag!='y'&&flag!='n') { printf("输入错误,请重新输入\n"); scanf("%s",&flag); i++; if(i>2) break; } } fwrite(q,sizeof(Link),1,fp); fclose(fp); q->next=NULL; return L; } void InsertLink(Link *L)//插入 { Link *q,*p; q=L; int j=0,i; printf("输入要插入的位置:\n"); scanf("%d",&i); while(j<i-1&&q->next!=NULL)//查找第i-1个元素 { j++; q=q->next; } if(q==NULL)//没有找到第i-1个元素 printf("没有找到要插入的位置!\n"); else { p=(Link *)malloc(sizeof(Link)); printf("输入要插入的信息:\n"); printf("编号:\n"); scanf("%d",&p->data.num); printf("姓名:\n"); scanf("%s",p->data.name); printf("地址:\n"); scanf("%s",p->data.addr); printf("电话号码:\n"); scanf("%s",p->data.telenum); p->next=q->next; q->next=p; printf("插入成功!\n"); } } void PrintLink(Link *L)//显示 { Link *p; p=L; if(p==NULL||p->next==NULL) //链表为空 printf("您的操作有误,请确保您的通讯录不为空!\n"); else { p=L->next; while(p!=NULL) { printf("| 编号 | 姓名 | 电话号码 | 地址 |\n"); printf("|---------|-----------|----------------|----------------|\n"); printf("%-10d%-20s%-20s%-20s\n",p->data.num,p->data.name,p->data.telenum,p->data.addr); p=p->next; } } } void DeleteLink(Link *L)//删除 { Link *q,*p; q=L; int j=0,i,n; printf("1.删除整个通讯录\t\t2.删除某一个元素:\n"); printf("请输入您的选择:\n"); scanf("%d",&n); if(n==1) { if(q==NULL||q->next==NULL) //链表为空 printf("您的操作有误,请确保您的通讯录不为空!\n"); else DestoryLink(L); } else if(n==2) { printf("输入要删除的位置:\n"); scanf("%d",&i); while(j<i-1&&q!=NULL)//查找第i-1个元素 { j++; q=q->next; } if(q==NULL) printf("没有找到要删除的位置!\n"); else { p=(Link *)malloc(sizeof(Link)); p=q->next; if(p==NULL) printf("没有找到要删除的位置!\n"); q->next=p->next; free(p); printf("删除元素成功!\n"); } } else { printf("输入错误,请重新输入\n"); scanf("%d",&n); } } void DestoryLink(Link *L)//销毁线性表 { Link *p; p=L->next; while(p!=NULL) { L->next=p->next; free(p);//释放节点的内存 p=L->next; } free(p); } void SearchLink(Link *L)//查询 { int n,flag=1; Link *q; q=L; if(q==NULL||q->next==NULL) //链表为空 printf("您的操作有误,请确保您的通讯录不为空!\n"); else { PrintLink(L); printf("你想通过什么方式查找?\n"); printf("1.编号\t\t2.姓名\t\t3.电话号码\t4.返回\n"); scanf("%d",&n); do{ if(n==1) {Find_Num(L);return;} if(n==2) {Find_Name(L);return;} if(n==3) {Find_Tel(L);return;} if(n==4) { system("cls"); return ;} else{ flag=0; printf("输入不正确,请重新输入:"); scanf("%d",&n); } } while(flag==0); } } void Find_Num(Link *L) //按序号查询 { Link *q,*p; q=L->next; printf("输入要查询的编号:\n"); p=(Link*)malloc(sizeof(Link)); scanf("%d",&p->data.num); while(q!=NULL&&q->data.num!=p->data.num) { q=q->next; } if(q==NULL) { printf("通讯录中没有这个编号!\n"); } else { printf("| 编号 | 姓名 | 电话号码 | 地址 |\n"); printf("|---------|-----------|----------------|----------------|\n"); printf("%-10d%-20s%-20s%-20s\n",q->data.num,q->data.name,q->data.addr,q->data.telenum); } } void Find_Name(Link *L)//按姓名查询 { Link *q,*p; q=L->next; p=(Link*)malloc(sizeof(Link)); printf("输入要查询的姓名:\n"); scanf("%s",p->data.name); while(q!=NULL&&strcmp(q->data.name,p->data.name)!=0) { q=q->next; } if(q==NULL) { printf("通讯录中没有这个姓名!\n"); } else { printf("| 编号 | 姓名 | 电话号码 | 地址 |\n"); printf("|---------|-----------|----------------|----------------|\n"); printf("%-10d%-20s%-20s%-20s\n",q->data.num,q->data.name,q->data.addr,q->data.telenum); } } void Find_Tel(Link *L)//按电话号码查询 { Link *q,*p; q=L->next; p=(Link*)malloc(sizeof(Link)); printf("输入要查询的电话号码:\n"); scanf("%s",p->data.telenum); while(q!=NULL&&strcmp(q->data.telenum,p->data.telenum)!=0) { q=q->next; } if(q==NULL) { printf("通讯录中没有这个电话号码!\n"); } else { printf("| 编号 | 姓名 | 电话号码 | 地址 |\n"); printf("|---------|-----------|----------------|----------------|\n"); printf("%-10d%-20s%-20s%-20s\n",q->data.num,q->data.name,q->data.addr,q->data.telenum); } } void ChangeLink(Link *L)//修改 { Link *q; q=L; char s[20]; int n,m; if(q==NULL||q->next==NULL) //链表为空 printf("您的操作有误,请确保您的通讯录不为空!\n"); else { PrintLink(L); printf("1.要修改的编号为:\t2.要修改的名字为:\t3.要修改的电话号码为:\n"); printf("输入您的选择:\n"); scanf("%d",&n); if(n==1) { printf("输入要修改的编号:\n"); scanf("%d",&m); while(q!=NULL) { if(q->data.num==m) { printf("输入修改的信息:\n"); printf("编号:\n"); scanf("%d",&q->data.num); break; } q=q->next; } if(q==NULL) printf("您要修改的信息不存在!\n"); } else if(n==2) { printf("输入要修改的姓名:\n"); scanf("%s",s); while(q!=NULL) { if(strcmp(q->data.name,s)==0) { printf("输入修改的信息:\n"); printf("姓名:\n"); scanf("%s",q->data.name); break; } q=q->next; } if(q==NULL) printf("您要修改的信息不存在!\n"); } else if(n==3) { printf("输入要修改的电话号码:\n"); scanf("%s",s); while(q!=NULL) { if(strcmp(q->data.telenum,s)==0) { printf("输入修改的信息:\n"); printf("电话号码:\n"); scanf("%s",q->data.telenum); break; } q=q->next; } if(q==NULL) printf("您要修改的信息不存在!\n"); } else { printf("输入错误,请重新输入\n"); scanf("%d",&n); getchar(); } } } void Save(Link *L)//保存 { FILE*fp; Link *p; p=L; if((fp=fopen("telebook.txt","w"))==NULL) { printf("cannot open this file\n"); exit(0); } if(p==NULL||p->next==NULL) //链表为空 printf("您的操作有误,请确保您的通讯录不为空!\n"); else { while(p!=NULL) { fprintf(fp,"%d%s%s%s\n",p->data.num,p->data.name,p->data.addr,p->data.telenum); fclose(fp); p=p->next; } printf("通讯录保存成功!\n"); } } void Clear()//清屏函数 { system("pause");//输入任意键继续 system("cls");//清屏 } void Menu()//菜单 { printf("\t ★☆★☆★【欢迎进入通讯录管理系统】★☆★☆★\n"); printf("\t\t******************menu********************\n"); printf("\t\t┌───────────────────┐\n"); printf("\t\t\t ●a、 通讯信息录入\n"); printf("\t\t\t ●b、 通讯信息插入\n"); printf("\t\t\t ●c、 通讯信息显示\n"); printf("\t\t\t ●d、 通讯信息保存\n"); printf("\t\t\t ●e、 通讯信息删除\n"); printf("\t\t\t ●f、 通讯信息修改\n"); printf("\t\t\t ●g、 通讯信息查询\n"); printf("\t\t\t ◆Ⅰ、按编号查询\n"); printf("\t\t\t ◆Ⅱ、按姓名查询\n"); printf("\t\t\t ◆Ⅲ、按电话号码查询\n"); printf("\t\t\t ●h、 退出系统\n"); printf("\t\t└───────────────────┘\n"); printf("\t\t******************************************\n"); printf("请输入您的选择\n"); } void Quit()//退出 { printf("\n\n\n\n\n"); printf("\t\t★★★★★★★★★★★★★★★★★★★★★\n"); printf("\t\t★★★★★★★感谢您的使用★★★★★★★★\n"); printf("\t\t★★★★★★★欢迎再次使用★★★★★★★★\n"); printf("\t\t★★★★★★★★★谢谢★★★★★★★★★★\n"); printf("\n\n\n\n\n\t\t\t\t\t\tBy Mr.wang\n"); exit(0); } int main() { system("color 2E");/*改变控制台颜色*/ char chioce; while(1) { Menu(); scanf("%s",&chioce); switch(chioce) { case 'a': system("cls"); L=CreatLink(L); Clear(); break; case 'b': system("cls"); InsertLink(L); Clear(); break; case 'c': system("cls"); PrintLink(L); Clear(); break; case 'd': system("cls"); Save(L); Clear(); break; case 'e': system("cls"); DeleteLink(L); Clear(); break; case 'f': system("cls"); ChangeLink(L); Clear(); break; case 'g': system("cls"); SearchLink(L); Clear(); break; case 'h': system("cls"); Quit(); break; default : printf("您的输入有误,请重新输入:\n"); Clear(); break; } } return 0; }
改进了一下保存的函数,处理文件,能够保存输入的文件了~
void Save(Link *L)//保存 { FILE*fp; Link *p,*q; p=L; if((fp=fopen("telebook.txt","a+"))==NULL) { printf("cannot open this file\n"); exit(0); } if(p==NULL||p->next==NULL) //链表为空 printf("您的操作有误,请确保您的通讯录不为空!\n"); else { while(p->next!=NULL) { q=p->next; fprintf(fp,"%d %s %s %s\n",q->data.num,q->data.name,q->data.addr,q->data.telenum); p=p->next; } fclose(fp); printf("通讯录保存成功!\n"); } }
更新一下添加了可以按名字删除,按电话号码删除,按编号删除,先查询再删除;
void DeleteLink(Link *L)//删除菜单 { Link *q; q=L; int j=0,n; printf("\t1.删除整个通讯录\n\t2.按名字删除:\n\t3.按编号删除\n\t4.按电话号码删除\n"); printf("\t请输入您的选择:\n"); scanf("%d",&n); if(n==1) { if(q==NULL||q->next==NULL) //链表为空 printf("您的操作有误,请确保您的通讯录不为空!\n"); else DestoryLink(L); } else if(n==2) { Delete_name(L); } else if(n==3) { Delete_num(L); } else if(n==4) { Delete_Tel(L); } else { printf("输入错误,请重新输入\n"); scanf("%d",&n); } } void Delete(Link *L,int i)//删除节点 { Link *q,*p; q=L; int j=0,n; while(j<i-1&&q!=NULL)//查找第i-1个元素 { j++; q=q->next; } if(q==NULL) printf("没有找到要删除的位置!\n"); else { p=(Link *)malloc(sizeof(Link)); p=q->next; if(p==NULL) printf("没有找到要删除的位置!\n"); q->next=p->next; free(p); printf("删除元素成功!\n"); } } void Delete_name(Link *L)//按名字删除 { int i; i=Find_Name(L); Delete(L,i); } void Delete_Tel(Link *L)//按电话号码删除 { int i; i=Find_Tel(L); Delete(L,i); } void Delete_num(Link *L)//按编号删除 { int i; i=Find_Num(L); Delete(L,i); }