c语言链表实现通讯录

来源:互联网 发布:中学生网络交友新闻 编辑:程序博客网 时间:2024/05/16 14:19
#include <stdio.h> 
#include <stdlib.h>
#include <string.h> 
#define N 50
typedef struct PersonalInfo
{
    char name[50];
    char address[30];
    char tel[30];
    char postcode[30];
    struct PersonalInfo *next; //节点指针
}INFO;
typedef struct{
char name[50];
char address[30];
    char tel[30];
    char postcode[30];
}str;


INFO *head;
void Initiate();
void write_file(INFO *head,int len);
void Menu();
void Create(); //功能:创建新通讯录
void Add();    // 通讯录末尾写入新信息并返选单
void Find();   //查找记录
void Alter();  //修改记录未找要修改则提示通讯录没信息并返选单
void Delete(); //删除某信息未找要删提示通讯录没信息并返选单
void List();   //功能:显示通讯录所记录


//初始化
void  Initiate()
{
    if((head=(INFO *)malloc(sizeof(INFO)))==NULL) exit(1); //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("***********    6.显示所有好友    ***********\n");
    printf("***********    0.退通讯录      ***********\n\n\n");
    
}








//创建通讯录
void Create()
{     
     
void clear();
     INFO *p1[100],*p2;
     int  m,i;
 
     printf("请输入创建数:");
     scanf("%d",&m);
 
     for(i=1;i<=m;i++)
     {   
  
         p1[i]=(INFO *)malloc(sizeof(INFO));
         printf("请输入第%d条信息!\n",i);
         printf("姓名:\n");
         scanf("%s",&p1[i]->name);
         printf("地址:\n");
         scanf("%s",&p1[i]->address);
         printf("电话:\n");
         scanf("%s",&p1[i]->tel);
         printf("邮编:\n");
         scanf("%s",&p1[i]->postcode);
         p1[i]->next=NULL;
         if(head->next==NULL)  //如果找到的最小节点就是第一个节点
         {  
              head->next=p1[i];
         }
         else
         {
             for(p2=head;p2->next!=NULL;p2=p2->next);       //找结点尾
             p2->next=p1[i];
         }
      }
      printf("信息已添加\n");
      return;                                     //保存链表
}


//添加通讯录好友
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->address);
     printf("电话:\n");
     scanf("%s",q->tel);
     printf("邮编:\n");
     scanf("%s",q->postcode);
 
 
     for(p=head;p->next!=NULL;p=p->next) ;
        p->next=q;
     q->next=NULL;
     printf("信息已添加!\n");
     return;
}
//查找通讯录信息
void Find()
{
    INFO *p;
    char name[50];
    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地址\t邮编\t电话\n");
           printf("%s\t%s\t%s\t%s\n",p->name,p->address,p->postcode,p->tel);
       }
       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("新的姓名:\n");                             //添加信息
    scanf("%s",p1->name);
    strcpy(p->name,p1->name);
    printf("新的地址:\n");
    scanf("%s",p1->address);
    strcpy(p->address,p1->address);
    printf("新的电话:\n");
    scanf("%s",p1->tel);
    strcpy(p->tel,p1->tel);
    printf("新的邮编:\n");
    scanf("%s",p1->postcode);
    strcpy(p->postcode,p1->postcode);
    printf("信息已修改\n");
    //显示修改信息
    printf("姓名\t地址\t邮编\t电话\n");
    printf("%s\t%s\t%s\t%s\n",p->name,p->address,p->postcode,p->tel);
    free(p1);
}


//删除通讯录信息
void Delete()
{
    char  name[50];                                     //先查找 删除
    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地址\t邮编\t电话\n");
    for(p2=head->next;p2!=NULL;p2=p2->next)
       printf("%s\t%s\t%s\t%s\n",p2->name,p2->address,p2->postcode,p2->tel);
}


//显示所记录
void List()
{    
     INFO *p;
    
    
    if(head->next==NULL)
    {
        printf("通讯录记录!\n");
        return;
    }
    printf("姓名\t地址\t邮编\t电话\n");
    for(p=head->next;p!=NULL;p=p->next)
    printf("%s\t%s\t%s\t%s\n",p->name,p->address,p->postcode,p->tel);
   
}
void write_file(INFO *head,int len)
{
int i;
str string[100];
FILE *fp = fopen("aaa","w");
if(NULL==fp)
{
printf("open error!\n");
exit(1);
}
while(head->next!=NULL)
{
for(i=0;i<len;i++)
{
strcpy(string[i].name,head->next->name);
strcpy(string[i].address,head->next->address);
strcpy(string[i].tel,head->next->tel);
strcpy(string[i].postcode,head->next->postcode);
fwrite(&string[i],sizeof(str),1,fp);
head = head->next;
}
}
fclose(fp);
}


int main() 




    int  choice;
    char  yes_no;
    
    Initiate();
    do
    {
        Menu();
        printf("请输入指令0-6:\n");
        scanf("%d",&choice);
        printf("\n");
        switch(choice)
       {
            case 1:Create();
     
            break;
            case 2:Add();
      
            break;
            case 3:Find();
            break;
            case 4:Alter();
            break;
            case 5:Delete();
            break;
            case 6:List();
            break;
            case 0:write_file(INFO *head,int len);
            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');
}
原创粉丝点击