数据结构的第二个课程设计,在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);
}