数据结构课程设计之通讯录管理系统

来源:互联网 发布:淘宝主图设计 编辑:程序博客网 时间:2024/04/27 15:08

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

4 0
原创粉丝点击