文件通讯录

2023-11-20

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd.
File name:
Author:Jerey_Jobs    Version:0.1    Date:
Description:
Funcion List:
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define password 208140119
#define NAME_MAX 20
#define GENDER_MAX 10
#define STR_MAX 20
#define TEL_MAX 20
//链表结构
struct address
{
 long count;
    char name[NAME_MAX];
 char gender[GENDER_MAX];
 int age;
 char tel[TEL_MAX];
 char strict[STR_MAX];
 struct address *prior,*next;
};
typedef struct address Data;
typedef struct address * DATA;
void create_link(DATA *head);        //创建链表
void create_newnode(DATA *newnode);        //创建新的节点
void is_malloc_ok(DATA *newnode);         //判断动态分配存储空间是否成功
//void address(DATA *head);        //对通讯录操作的函数
void menu_password(DATA *head);        //登录界面
void quit();        //退出通讯录
void menu(DATA *head);        //进入操作界面
void add(DATA *head);        //添加信息
void quit_real();        //真实退出
void display_all(DATA *head);        //显示全部信息
void find(DATA *head);        //查找信息界面
void find_count(DATA *head);        //按学号查找
void find_name(DATA *head);        //按姓名查找
void find_tel(DATA *head);        //按电话号码查找
void find_str(DATA *head);        //按地区查找
void delete(DATA *head);        //删除信息界面
void del_count(DATA *head);         //按学号删除
void del_name(DATA *head);         //按姓名删除
void del_tel(DATA *head);        //按电话号码删除
void del_str(DATA *head);        //按地区删除
void del(DATA temp,DATA *head);        //确认删除信息界面
void revise(DATA *head);        //修改信息界面
void rev(DATA temp,DATA *head);        //确认修改信息界面
void rev_sel(DATA temp,DATA *head);        //修改信息
void rev_count(DATA *head);
void rev_name(DATA *head);
void rev_tel(DATA *head);
void rev_strict(DATA *head);
void file_read(DATA *head);
void file_write(DATA *head);
int main()
{
 DATA head = NULL;
 create_link(&head);        //创建链表
 file_read(&head);
 menu_password(&head);        //进入操作界面
    return 0;
}
void file_write(DATA *head)
{
 DATA temp;
    FILE *fp;
 temp = (*head);
    if((fp = fopen("tongxunlu.txt","w")) == NULL)
 {
  perror("open file error!\n");
  exit(-1);
 }
 fseek(fp,0,SEEK_SET);
 while(temp->next != (*head))
 {
  temp = temp->next;
  fwrite(temp,sizeof(Data),1,fp);
  //temp = temp->next;
 printf("success\n");
 }
 fclose(fp);
}
void file_read(DATA *head)
{
 DATA newnode = NULL;
    FILE *fp;
    if((fp = fopen("tongxunlu.txt","r")) == NULL)
 {
  perror("open file error!\n");
  exit(-1);
 }
 fseek(fp,0,SEEK_SET);
  create_newnode(&newnode);
  fread(newnode,sizeof(Data),1,fp);
  if(newnode->count == 0)
   ;
  else
  {
  newnode->next = (*head);
  newnode->prior = (*head)->prior;
  (*head)->prior->next = newnode;
  (*head)->prior = newnode;
  }
 while(!feof(fp))
 {
  create_newnode(&newnode);
  fread(newnode,sizeof(Data),1,fp);
  if(newnode->count == 0)
   break;
  else
  {
  newnode->next = (*head);
  newnode->prior = (*head)->prior;
  (*head)->prior->next = newnode;
  (*head)->prior = newnode;
     printf("success\n");
  }
 // create_newnode(&newnode);
 }
 fclose(fp);
}
//创建链表
void create_link(DATA *head)
{
 create_newnode(head);
 (*head)->prior = (*head)->next = (*head);
}
//创建新的节点
void create_newnode(DATA *newnode)
{
 *newnode = (DATA)malloc(sizeof(Data));
 is_malloc_ok(newnode);
}
//判断动态分配存储空间是否成功
void is_malloc_ok(DATA *newnode)
{
 if(*newnode == NULL)
 {
  printf("malloc error !\n");
  exit(-1);
 }
}

//登录界面
void menu_password(DATA *head)
{
 long password_enter;
 int select;
// DATA temp;
// temp = (*head)->next;
 printf("//*********************************************************\\\\\n");
 printf("//*********************************************************\\\\\n");
    printf("//                  南京工程学院班级通讯录                 \\\\\n");
 printf("//                       Version 1.0                       \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                       (1)登录                           \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                       (2)退出                           \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("\n\n");
 printf("请输入您的选择...\n");
 scanf("%d",&select);
 if(select == 1)
 {
  printf("请输入密码...\n");
     scanf("%ld",&password_enter);
     if(password == password_enter)
     {
      printf("密码正确!\n");
      menu(head);
   return;
     }
     else
     {
   printf("密码错误!\n");
            menu_password(head);
   return;
     }
 }
 else if(select == 2)
 {
  quit();
  return;
 }
 else
 {
  printf("您的输入有误!\n");
  menu_password(head);
  return;
 }
}
//退出界面
void quit(DATA *head)
{
 int flag;
// DATA temp
// temp = *head;
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//**************************退出界面***********************\\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                       (1)确认退出                       \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                       (2)返回登录界面                   \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("\n");
 printf("请输入您的选择...\n");
 scanf("%d",&flag);
 if(flag == 1)
 {
    file_write(head);
  quit_real();
  return;
 }
 else if(flag == 2)
 {
  menu_password(head);
  return;
 }
 else
 {
  printf("您的输入有误!\n");
  quit(head);
  return;
 }
}
//真实退出
void quit_real()
{
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("//                                                         \\\\\n");
    printf("//                        谢谢使用!                       \\\\\n");
 printf("//                                                         \\\\\n");
    printf("//                        您已退出!                       \\\\\n");
    printf("//                                                         \\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("\n");
 return;
}
//操作界面
void menu(DATA *head)
{
 int choose;
// DATA temp;
// temp = *head;
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//*********************************************************\\\\\n");
    printf("//                    南京工程学院通讯录                   \\\\\n");
 printf("//                       Version 1.0                       \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                       (1)查询                           \\\\\n");
 printf("//                       (2)添加信息                       \\\\\n");
 printf("//                       (3)删除信息                       \\\\\n");
 printf("//                       (4)修改信息                       \\\\\n");
 printf("//                       (5)退出                           \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("\n");
 printf("请输入您的选择...\n");
 scanf("%d",&choose);
 switch(choose)
 {
  case 1 :find(head);break;
  case 2 :add(head);break;
  case 3 :delete(head);break;
  case 4 :revise(head);break;
  case 5 :quit(head);break;
  default : {
       printf("您的输入有误!\n");
                      menu(head);
      };break;
 }
 return;
}
//添加用户信息
void add(DATA *head)
{
 DATA temp;
    DATA newnode = NULL;
    temp = (*head)->next;
    long count;
 create_newnode(&newnode);
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//**********************添加信息界面***********************\\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                                                         \\\\\n");
 printf("//                       请输入用户学号:");
 scanf("%ld",&newnode->count);
 count = newnode->count;
 printf("//                       请输入用户姓名:");
 scanf("%s",newnode->name);
 printf("//                       请输入用户性别:");
 scanf("%s",newnode->gender);
 printf("//                       请输入用户年龄:");
 scanf("%d",&newnode->age);
 printf("//                       请输入用户电话:");
 scanf("%s",newnode->tel);
 printf("//                       请输入用户地区:");
 scanf("%s",newnode->strict);
 printf("//                                                         \\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("//*********************************************************\\\\\n");
 printf("\n");
    if(temp == *head)        //链表为空,新节点插入到头节点之后的第一的位置
 {
  newnode->next = (*head)->next;
  newnode->prior = (*head);
  (*head)->next = newnode;
  (*head)->prior = newnode;
     printf("信息录入成功!\n");
        menu(head);
  return;
 }
 if(temp->next == *head)        //链表不为空,只有一个节点
 {
  if(temp->count > count)        //只有一个节点,对要插入的节点和第一个节点作比较
  {
   newnode->next = temp;
   newnode->prior = (*head);
   temp->prior = newnode;
   (*head)->next = newnode;
  }
  else
  {
   newnode->next = temp->next;
   newnode->prior = temp;
   temp->next->prior = newnode;
   temp->next = newnode;
  }
     printf("信息录入成功!\n");
        menu(head);
     return;
 }
 else
 {                            //多个节点的情况
  while(temp->count < count && temp->next != (*head))        //循环判断
  {
   temp = temp->next;
  }
  if(temp == (*head)->next)        //遇到第一个节点就退出循环,即新节点为当前链表最小
  {
   newnode->next = temp;
   newnode->prior = (*head);
   temp->prior = newnode;
   (*head)->next = newnode;
  }
  else
  {                    
   if(temp->next == (*head))        //查询到当前链表的尾节点
   {
    if(temp->count < count)        //新节点比尾节点大,即插入到尾节点之后
    {
        newnode->next = (*head);
        newnode->prior = temp;
        temp->next = newnode;
           (*head)->prior = newnode;
       }
       else
       {                         //新节点比尾节点小,插入到尾节点之前
        newnode->next = temp;
        newnode->prior = temp->prior;
        temp->prior->next = newnode;
     temp->prior = newnode;
       }
   }
   else        //对于不到尾节点的新节点作处理
   {
    newnode->next = temp;
    newnode->prior = temp->prior;
    temp->prior->next = newnode;
    temp->prior = newnode;
   }
  }
     printf("信息录入成功!\n");
        menu(head);
  return;
 }
}
//显示所有用户信息
void display_all(DATA *head)
{
 DATA temp;
 temp = (*head)->next;
 if(temp == *head)        //链表为空
 {
  printf("通讯录信息为空!\n");
     find(head);
  return;
 }
 else
 {
  while(temp != *head)        //链表不为空
     {
         printf("\n");
         printf("//*********************************************************\\\\\n");
         printf("//**********************显示信息界面***********************\\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                       学号 : %d \n",temp->count);
      printf("//                       姓名 : %s \n",temp->name);
      printf("//                       性别 : %s \n",temp->gender);
      printf("//                       年龄 : %d \n",temp->age);
      printf("//                       电话号码 : %s \n",temp->tel);
      printf("//                       地区 : %s \n",temp->strict);
         printf("//                                                         \\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("\n");
      temp = temp->next;
     }
  printf("成功显示!\n");
     find(head);
  return;
 }
}
//查找用户信息
void find(DATA *head)
{
 int select;
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//**********************查询信息界面***********************\\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                      (1)按学号查找                      \\\\\n");
    printf("//                      (2)按姓名查找                      \\\\\n");
    printf("//                      (3)按电话号码查找                  \\\\\n");
    printf("//                      (4)按地区查找                      \\\\\n");
    printf("//                      (5)全部显示                        \\\\\n");
    printf("//                      (6)返回主菜单                      \\\\\n");
 printf("//                                                         \\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("\n");
 printf("请输入您的选择...\n");
 scanf("%d",&select);
 switch(select)
 {
  case 1 :find_count(head);break;
  case 2 :find_name(head);break;
  case 3 :find_tel(head);break;
  case 4 :find_str(head);break;
  case 5 :display_all(head);break;
  case 6 :menu(head);break;
  default :{
      printf("您的输入有误!请重新输入...\n");
      menu(head);
     };break;
 }
 return;
}
//学号查找用户信息
void find_count(DATA *head)
{
 DATA temp;
 long count;
 temp = (*head)->next;
 printf("请输入您要查找信息的学号...\n");
 scanf("%ld",&count);
 printf("正在查询...\n");
   
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  find(head);
  return;
 }
 else
 {
  while(temp->count != count && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要查找用户的信息!\n");
   find(head);
   return;
  }
  else
  {
         printf("\n");
         printf("//*********************************************************\\\\\n");
         printf("//**********************查询信息界面***********************\\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                       学号 : %d \n",temp->count);
      printf("//                       姓名 : %s \n",temp->name);
      printf("//                       性别 : %s \n",temp->gender);
      printf("//                       年龄 : %d \n",temp->age);
      printf("//                       电话号码 : %s \n",temp->tel);
      printf("//                       地区 : %s \n",temp->strict);
         printf("//                                                         \\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("\n");
   find(head);
   return;    
  }
 }
}
//姓名查找用户信息
void find_name(DATA *head)
{
 DATA temp;
 char name[NAME_MAX];
 temp = (*head)->next;
 printf("请输入您要查找信息的姓名...\n");
 scanf("%s",name);
 printf("正在查询...\n");
   
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  find(head);
  return;
 }
 else
 {
  while( strcmp(temp->name,name) != 0&& temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要查找用户的信息!\n");
      find(head);
   return;
  }
  else
  {
   printf("\n");
         printf("//*********************************************************\\\\\n");
         printf("//**********************查询信息界面***********************\\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                       学号 : %d \n",temp->count);
      printf("//                       姓名 : %s \n",temp->name);
      printf("//                       性别 : %s \n",temp->gender);
      printf("//                       年龄 : %d \n",temp->age);
      printf("//                       电话号码 : %s \n",temp->tel);
      printf("//                       地区 : %s \n",temp->strict);
         printf("//                                                         \\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("\n");
      find(head);
   return;
  }
 }
}
//电话号码查找用户信息
void find_tel(DATA *head)
{
 DATA temp;
 char tel[TEL_MAX];
 temp = (*head)->next;
 printf("请输入您要查找信息的电话号码...\n");
 scanf("%s",tel);
 printf("正在查询...\n");
   
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  find(head);
  return;
 }
 else
 {
  while(strcmp(temp->tel,tel) != 0 && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要查找用户的信息!\n");
   find(head);
   return;
  }
  else
  {
   printf("\n");
         printf("//*********************************************************\\\\\n");
         printf("//**********************查询信息界面***********************\\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                       学号 : %d \n",temp->count);
      printf("//                       姓名 : %s \n",temp->name);
      printf("//                       性别 : %s \n",temp->gender);
      printf("//                       年龄 : %d \n",temp->age);
      printf("//                       电话号码 : %s \n",temp->tel);
      printf("//                       地区 : %s \n",temp->strict);
         printf("//                                                         \\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("\n");
   find(head);
   return;
  }
 }
}
//地区查找用户信息
void find_str(DATA *head)
{
 DATA temp;
 char strict[STR_MAX];
 temp = (*head)->next;
 printf("请输入您要查找用户信息的地区...\n");
 scanf("%s",strict);
 printf("正在查询...\n");
   
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  find(head);
  return;
 }
 else
 {
  while( strcmp(temp->strict,strict) != 0 && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要查找用户的信息!\n");
   find(head);
   return;
  }
  else
  {
   printf("\n");
         printf("//*********************************************************\\\\\n");
         printf("//**********************查询信息界面***********************\\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                                                         \\\\\n");
         printf("//                       学号 : %d \n",temp->count);
      printf("//                       姓名 : %s \n",temp->name);
      printf("//                       性别 : %s \n",temp->gender);
      printf("//                       年龄 : %d \n",temp->age);
      printf("//                       电话号码 : %s \n",temp->tel);
      printf("//                       地区 : %s \n",temp->strict);
         printf("//                                                         \\\\\n");
         printf("//*********************************************************\\\\\n");
         printf("\n");
   find(head);
   return;
  }
 }
}
//删除用户信息
void delete(DATA *head)
{
 int select;
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//**********************删除信息界面***********************\\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                      (1)按学号查找删除                  \\\\\n");
    printf("//                      (2)按姓名查找删除                  \\\\\n");
    printf("//                      (3)按电话号码查找删除              \\\\\n");
    printf("//                      (4)按地区查找删除                  \\\\\n");
    printf("//                      (5)返回主菜单                      \\\\\n");
 printf("//                                                         \\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("\n");
 printf("请输入您的选择...\n");
 scanf("%d",&select);
 switch(select)
 {
  case 1 :del_count(head);break;
  case 2 :del_name(head);break;
  case 3 :del_tel(head);break;
  case 4 :del_str(head);break;
  case 5 :menu(head);break;
  default :{
      printf("您的输入有误!请重新输入...\n");
      getchar();
      menu(head);
     };break;
 }
 return;
}
//学号删除用户信息
void del_count(DATA *head)
{
 DATA temp;
 long count;
 int select;
 temp = (*head)->next;
 printf("请输入您要删除信息的学号...\n");
 scanf("%ld",&count);
 printf("正在查询信息...\n");
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  delete(head);
  return;
 }
 else
 {
  while( temp->count != count && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要删除用户的信息!\n");
   delete(head);
   return;
  }
  else
  {
   del(temp,head);
   return;
  }
 }
}
//删除信息界面
void del(DATA temp,DATA *head)
{
 int select;
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//**********************删除信息界面***********************\\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                       学号 : %d \n",temp->count);
 printf("//                       姓名 : %s \n",temp->name);
 printf("//                       性别 : %s \n",temp->gender);
 printf("//                       年龄 : %d \n",temp->age);
 printf("//                       电话号码 : %s \n",temp->tel);
 printf("//                       地区 : %s \n",temp->strict);
 printf("//                                                         \\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("\n");
 printf("您要删除的信息如上,是否真的要删除(删除 :1 or 返回 :2)\n");
 scanf("%d",&select);
 switch(select)
 {
  case 1 :{
     temp->prior->next = temp->next;
     temp->next->prior = temp->prior;
     printf("该信息已删除!\n");
     delete(head);
     return;
    };break;
  case 2 :{
     delete(head);
    };break;
  default :{
      printf("您的输入有误!请重新输入...\n");
      getchar();
      del(temp,head);
     };break;
 }
     return;
}
//姓名删除用户信息
void del_name(DATA *head)
{
 DATA temp;
 char name[NAME_MAX];
 int select;
 temp = (*head)->next;
 printf("请输入您要删除信息的姓名...\n");
 scanf("%s",name);
 printf("正在查询信息...\n");
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  delete(head);
  return;
 }
 else
 {
  while( strcmp(name,temp->name) != 0 && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要删除用户的信息!\n");
   delete(head);
   return;
  }
  else
  {
   del(temp,head);
   return;
  }
 }
}
//电话号码删除用户信息
void del_tel(DATA *head)
{
 DATA temp;
 char tel[TEL_MAX];
 int select;
 temp = (*head)->next;
 printf("请输入您要删除用户信息的电话号码...\n");
 scanf("%s",tel);
 printf("正在查询信息...\n");
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  delete(head);
  return;
 }
 else
 {
  while( strcmp(tel,temp->tel) != 0&& temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要删除用户的信息!\n");
   delete(head);
   return;
  }
  else
  {
   del(temp,head);
   return;
  }
 }
}
//地区删除用户信息
void del_str(DATA *head)
{
 DATA temp;
 char strict[STR_MAX];
 int select;
 temp = (*head)->next;
 printf("请输入您要删除用户信息的地区...\n");
 scanf("%s",strict);
 printf("正在查询信息...\n");
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  delete(head);
  return;
 }
 else
 {
  while( strcmp(strict,temp->strict) != 0 && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要删除用户的信息!\n");
   delete(head);
   return;
  }
  else
  {
   del(temp,head);
   return;
  }
 }
}
//修改用户信息
void revise(DATA *head)
{
 int select;
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//**********************修改信息界面***********************\\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                      (1)按学号查找修改                  \\\\\n");
    printf("//                      (2)按姓名查找修改                  \\\\\n");
    printf("//                      (3)按电话号码查找修改              \\\\\n");
    printf("//                      (4)按地区查找修改                  \\\\\n");
    printf("//                      (5)返回主菜单                      \\\\\n");
 printf("//                                                         \\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("\n");
 printf("请输入您的选择...\n");
 scanf("%d",&select);
 switch(select)
 {
  case 1 :rev_count(head);break;
  case 2 :rev_name(head);break;
  case 3 :rev_tel(head);break;
  case 4 :rev_strict(head);break;
  case 5 :menu(head);break;
  default : {
       printf("您的输入有误!请重新输入...\n");
        revise(head);
      };break;
 }
}
//学号查找修改用户信息
void rev_count(DATA *head)
{
 DATA temp;
 long count;
 temp = (*head)->next;
 printf("请输入您要修改用户信息的学号...\n");
 scanf("%ld",&count);
 printf("正在查询信息...\n");
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  revise(head);
  return;
 }
 else
 {
  while( temp->count != count && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要修改用户的信息!\n");
   revise(head);
   return;
  }
  else
  {
   rev(temp,head);
   return;
  }
 }
}
//修改用户信息
void rev(DATA temp,DATA *head)
{
 int select;
 printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//**********************修改信息界面***********************\\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                       学号 : %d \n",temp->count);
 printf("//                       姓名 : %s \n",temp->name);
 printf("//                       性别 : %s \n",temp->gender);
 printf("//                       年龄 : %d \n",temp->age);
 printf("//                       电话号码 : %s \n",temp->tel);
 printf("//                       地区 : %s \n",temp->strict);
 printf("//                                                         \\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("\n");
 printf("您要修改的信息如上,是否真的要修改(修改 :1 or 返回 :2)\n");
 scanf("%d",&select);
 switch(select)
 {
  case 1 :{
     rev_sel(temp,head);
     return;
    };break;
  case 2 :{
     revise(head);
    };break;
  default :{
      printf("您的输入有误!请重新输入...\n");
      getchar();
      rev(temp,head);
     };break;
 }
     return;
}
//选择修改什么选项
void rev_sel(DATA temp,DATA *head)
{
 int select;
    printf("\n");
 printf("//*********************************************************\\\\\n");
 printf("//**********************修改信息界面***********************\\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                                                         \\\\\n");
    printf("//                      (1)修改学号                        \\\\\n");
    printf("//                      (2)修改姓名                        \\\\\n");
    printf("//                      (3)修改性别                        \\\\\n");
    printf("//                      (4)修改年龄                        \\\\\n");
    printf("//                      (5)修改电话号码                    \\\\\n");
    printf("//                      (6)修改地区                        \\\\\n");
    printf("//                      (7)返回主菜单                      \\\\\n");
 printf("//                                                         \\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("//*********************************************************\\\\\n");
    printf("\n");
 printf("请输入您的选择...\n");
 scanf("%d",&select);
 switch(select)
 {
  case 1 :{
     printf("请输入您要修改的学号...\n");
     scanf("%ld",&temp->count);
     printf("修改成功!\n");
                    revise(head);
    };break;
  case 2 :{
     printf("请输入您要修改的姓名...\n");
     scanf("%s",temp->name);
     printf("修改成功!\n");
     revise(head);
    };break;
  case 3 :{
     printf("请输入您要修改的性别...\n");
     scanf("%s",temp->gender);
     printf("修改成功!\n");
     revise(head);
    };break;
  case 4 :{
     printf("请输入您要修改的年龄...\n");
     scanf("%d",&temp->age);
     printf("修改成功!\n");
     revise(head);
    };break;
  case 5 :{
     printf("请输入您要修改的电话号码...\n");
     scanf("%s",temp->tel);
     printf("修改成功!\n");
     revise(head);
    };break;
  case 6 :{
     printf("请输入您要修改的地区...\n");
     scanf("%s",temp->strict);
     printf("修改成功!\n");
     revise(head);
    };break;
  case 7 :{
     revise(head);
    };break;
  default :{
      printf("您的输入有误!请重新输入...\n");
                     rev_sel(temp,head);
     };break;
 }
 return;
}
//姓名查找修改用户信息
void rev_name(DATA *head)
{
    DATA temp;
 char name[NAME_MAX];
 int select;
 temp = (*head)->next;
 printf("请输入您要修改用户信息的姓名...\n");
 scanf("%s",name);
 printf("正在查询信息...\n");
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  revise(head);
  return;
 }
 else
 {
  while( strcmp(name,temp->name) != 0 && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要修改用户的信息!\n");
   revise(head);
   return;
  }
  else
  {
   rev(temp,head);
   return;
  }
 }
}
//电话号码查找修改用户信息
void rev_tel(DATA *head)
{
    DATA temp;
 char tel[TEL_MAX];
 int select;
 temp = (*head)->next;
 printf("请输入您要修改用户信息的电话号码...\n");
 scanf("%s",tel);
 printf("正在查询信息...\n");
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  revise(head);
  return;
 }
 else
 {
  while( strcmp(tel,temp->tel) != 0 && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要修改用户的信息!\n");
   revise(head);
   return;
  }
  else
  {
   rev(temp,head);
   return;
  }
 }
}
//地区查找修改用户信息
void rev_strict(DATA *head)
{
    DATA temp;
 char strict[STR_MAX];
 int select;
 temp = (*head)->next;
 printf("请输入您要修改用户信息的地区...\n");
 scanf("%s",strict);
 printf("正在查询信息...\n");
 if(temp == (*head))
 {
  printf("通讯录信息为空!\n");
  revise(head);
  return;
 }
 else
 {
  while( strcmp(strict,temp->strict) != 0 && temp != (*head))
  {
            temp = temp->next;
  }
  if(temp == (*head))
  {
   printf("没有您要修改用户的信息!\n");
   revise(head);
   return;
  }
  else
  {
   rev(temp,head);
   return;
  }
 }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件通讯录 的相关文章

  • 图像风格迁移cvpr2020_今日 Paper

    目录 CurricularFace 深度人脸识别的适应性课程学习损失 MaskGAN 多样和交互的面部图像操作 结合检测和跟踪的视频人体姿态估计 通过解纠缠表示的局部面部妆容迁移 基于自动生成的训练数据进行大规模事件抽取学习 Curricu
  • 【UiBot】RPA定时触发:机器人如何在指定时间执行任务?

    Q RPA机器人如何在指定时间点执行任务 A 用流程机器人 UiBot Worker 设置定时触发 人机交互的流程机器人 UiBot Worker 除了手动运行流程之外 还提供了 触发器 的功能 可以在满足一定条件时 有计划 有选择性地执行
  • C++定义二维数组并赋值,亲测可用

    代码在这里 拿走不谢 include
  • IDEA springboot项目导出jar包及运行jar包

    首先点击Terminal 在Terminal下输入 mvn clean package 看到以下这个提示则是打包成功 接着咱们可以在自己的项目下看到打包成功的jar包 如图 运行jar包 我的jar包位置如下 写一个bat文件 里面的内容为
  • 实时监控Cat之旅~配置Cat集群需要注意的问题

    在配置cat集群时 有一些设置是我们应该注意的 从它的部署文档中我们可以看到相关信息 但说的还不够明确和重要 大叔今天总结一下Cat集群配置的注意事项 服务端datasources xml用来设置连接的mysql 集群里的服务器对这项配置是
  • pyecharts运行后产生的html文件用浏览器打开空白

    引用 https github com pyecharts pyecharts issues 503 使用logging日志打印代码错误 coding utf 8 from future import unicode literals im
  • Mageia 9 发布:搭载 Linux 内核 6.4,支持 PulseAudio

    导读 Mageia 最初是 Mandriva Linux 的一个分支 但现在已经发展成全面的 独立 Linux 发行版 从 2010 年以来 Mageia 已经成为一个用于桌面或服务器的稳定且安全的操作系统 并且定期更新 它的近期的发布公告
  • C语言排序算法实现

    C语言实现各种排序算法 冒泡排序 选择排序 插入排序 希尔排序 插入方式 非交换方式 快速排序 归并排序 分治思想 基数排序 桶排序 基数排序的基本思想 典型的空间换时间方式 冒泡排序 include
  • moviepy 生成的视频只有声音没有图像

    问题描述 PDF转成视频 用moviepy 将图片生成视频的时候 生成的视频 有些播放器 播放只有声音没有图像 解决方案 查看源码后发现在 ffmpeg writer py 文件里面有一段这样的代码 if codec libx264 and
  • 在线AI日语视频音频翻译中文字幕

    新番视频没有字幕 AI日语字幕识别让你先睹为快 蓝海智能在线AI工具 niceaitools com languageTra 目前价格是每视频音频分钟0 42元 具体使用方法如下 1 格式工厂处理 把你的日语视频或音频文件 通过格式工厂处理
  • VBA 自定义函数 库存消耗截止

    两个自定义函数 按照库存 计算哪一周库存能消耗完 标出周 自定义函数 按照库存 计算消耗完的那一周实际消耗多少数量 自定义函数 从消耗完的那一周开始算起 后面的周消耗数量都变为0 按钮 Function HaoJin StockQty As
  • Pytorch中常用的损失函数

    Pytorch中常用的损失函数 回归 nn L1Loss nn MSELoss 分类 nn CrossEntropyLoss 回归 nn L1Loss 平均绝对误差 也称L1范数损失 计算预测值与真实值之间的误差绝对值 L 1 L o s
  • python中模块,包,库的概念

    https www cnblogs com mlgjb p 7875494 html 模块 就是 py文件 里面定义了一些函数和变量 需要的时候就可以导入这些模块 包 在模块之上的概念 为了方便管理而将文件进行打包 包目录下第一个文件便是
  • OpenGL入门教程之 深入理解

    一 OpenGL简介 OpenGL是一种用于渲染2D 3D矢量图形的跨语言 跨平台的应用程序编程规范 OpenGL包含一系列可以操作图形和图像的函数 但OpenGL没有实现这些函数 OpenGL仅规定每个函数应该如何执行以及其输出值 类似接
  • 若依开源框架登录扩展Springboot+security,密码、验证码多种登录

    自定义登录扩展类 继承DaoAuthenticationProvider类型 重写additionalAuthenticationChecks方法 CustomLoginAuthenticationProvider java package
  • 是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...

    华为是大企业 是不是很难进去啊 在华为做软件测试 能得到很好的发展吗 一进去就有9 5K 其实也没有想的那么难 直到现在 心情都还是无比激动 本人211非科班 之前在字节和腾讯实习过 这次其实没抱着什么特别大的希望投递 没想到华为可以再给我
  • 2023计算机毕业设计SSM最新选题之java个人微博网站1x930

    2023计算机毕业设计SSM最新选题之java个人微博网站1x930 做毕业设计一定要选好题目 毕设想简单 其实很简单 这里给几点建议 1 首先 学会收集整理 年年专业都一样 岁岁毕业人不同 很多人在做毕业设计的时候 都犯了一个错误 那就是
  • 数组理论干货

    数组 如果看文字麻烦就直接跳到最后一个代码块 Array 1 Java语言中的数组是一种引用数据类型 不属于基本数据类型 数组的父类是Object 2 数组实际上是一个容器 可以同时容纳多个元素 数组是一个数据的集合 数组 字面意思是 一组
  • JAVA输出一个爱心

    在 Java 中输出一个爱心可以使用字符画的方式 如下代码所示 public class LoveHeart public static void main String args System out println System out
  • discuz 论坛配置 QQ/163 网易邮箱

    步骤 在 discuz 后台的 站长 邮件设置 里按如下配置 SMTP 服务器固定 163 网易填 ssl smtp 163 com QQ 邮箱则填 ssl smtp qq com 端口 465 验证 勾选 配置完成后 会进行测试验证 发信

随机推荐

  • clamp 函数

    clamp 函数 返回范围内的一个数值 可以使用 clamp 函数将不断增加 减小或随机变化的数值限制在一系列的值中 float clamp float minnumber float maxnumber float parameter 最
  • 简单用用flex和bison

    简单用用flex和bison 参考博文 词法 语法分析器简介 定义 flex bison 文件间关系 具体例子 例1 输入name age时触发 输出name is age years old 例2 输入带有括号的满足乘法加法的表达式 输出
  • 有关ajax 不走回调函数的问题解析

    ajax是设置的返回值明明是json格式 但是返回值是json格式却接收不了 非要设置成text格式才可以接收的到 这是我的jQuery代码 function addSku id var m m id val var p p id val
  • JDBC(Java DataBase Connectivity)

    JDBC 目录 JDBC 简介 JDBC结构步骤 API接口 DriverManager Conection Statement ResultSet PreparedStatement 简介 JDBC是使用Java语言操作关系数据库的一套A
  • maven安装和环境变量配置

    myeclipse自带maven Maven4MyEclipse 创建项目 新建Web Projects项目 在新建的页面上打上maven的勾 新建的项目里会多出个pom xml文件 为项目添加依赖包 右键项目 选择Maven4MyEcli
  • 多对一查询

    是这样的 首先学生表中有三个属性 前两个属性要出现在结果集中 第三个属性哦用于查找教师的名字 然后呢 用resultMap重新处理 将老师的名字重新对应为学生表的第三个属性 其实这样做有局限 多对一查询 SQL语句 SELECT s id
  • python中文件的操作

    gt gt gt f open home ceshi mmm txt w w 为读写 gt gt gt f write zuoshouzhiyue n 写入数据 记得加 n gt gt gt f tell 当前在文件中的位置 14 gt g
  • QToolButton和QPushButton的区别

    用代码实践了一下QPushButton和QToolButton的差异 include widget h include
  • Mathematica函数大全

    一 运算符及特殊符号 Line1 执行Line 不显示结果 Line1 line2 顺次执行Line1 2 并显示结果 name 关于系统变量name 的信息 name 关于系统变量name 的全部信息 command 执行Dos 命令 n
  • 《权力的游戏》最终季上线!谁是你最喜爱的演员?这里有一份Python教程

    译者 刘畅 编辑 琥珀 出品 AI科技大本营 id rgznai100 权力的游戏 最终季已于近日开播 对于全世界翘首以待的粉丝们来说 其最大的魅力就在于 无法预知的人物命运 那些在魔幻时代的洪流中不断沉浮的人们 将会迎来怎样的结局 近日
  • DS18B20的原理及实例代码(51单片机、STM32单片机)

    一 DS18B20介绍 DS18B20数字温度传感器是DALLAS公司生产的单总线器件 用它来组成一个测温系统具有线路简单 体积小 在一根通信线上可以挂很多这样的数字温度传感器 十分方便 温度传感器种类众多 应用在高精度 高可靠性的场合时D
  • c语言程序for循环处设断点,C语言程序设计-循环.ppt

    C语言程序设计 循环 C语言程序设计 循环结构 while循环结构 例 求1 100之和 即 注意事项 如果循环体内只有一条语句 则可以不用大括号 语法上并没有要求一定要存在循环初始条件的设定 也没有要求循环条件中的变量必须在循环体内改变
  • 使用JTDS连接sqlserver数据库

    Java连接SQL Server 2000数据库时 有两种方法 1 通过Microsoft的JDBC驱动连接 此JDBC驱动共有三个文件 分别是mssqlserver jar msutil jar和msbase jar 但是Microsof
  • IDEA 查看Springboot单元测试代码覆盖率报错

    报错信息 D resource java jdk 1 8 261 bin java exe ea javaagent C Users 镜 AppData Local JetBrains IntelliJIdea2020 2 testAgen
  • 软路由自建iptv服务器,LEDE软路由 iPTV 实现任意端口看电视的方法

    摘 要 1 光猫直接连接电脑 超级管理员进入光猫后台修改光猫为桥接模式 把IPTV 的VLAN ID绑定到跟宽带一样的数据端口 如下图 2 软路由 我们以6网口的来演示 进入Lede后台 系统 进阶设置 配置dnsmasq添加代码 dhcp
  • 互联网寒冬?应届生还应该加入么?

    大家都在各种唱衰互联网行业 下面从真实的示例来分析一下 还能否加入这个行业 互联网企业现状 互联网企业地域分布 从业者从一线城市逐渐向低线扩展 对新一线及低线城市的青睐度上升 腾讯地域扩张 腾讯业务版图 阿里地域扩张 阿里业务版图 字节地域
  • PhpStorm为什么值得推荐?

    智能编码辅助 PhpStorm 是一个 PHP IDE 它实际上 获取 您的代码 它支持 PHP 5 3 5 4 5 5 5 6 7 0 7 1 7 2 提供动态错误预防 最佳自动完成和代码重构 零配置调试以及扩展的 HTML CSS 和J
  • sql ntext數據類型字符替換

    ntext數據類型字符替換 2011 08 21 塗聚文 create table tt sid INT IDENTITY 1 1 cont ntext go insert into tt cont values N fd sad fdsa
  • Qt 信号与槽

    Qt 信号与槽 在这章节里 我们学习 Qt 的信号与槽 这里分一个章节来学习这个 Qt 的信号与槽 可见 这个信号与槽有多么重要 在学习 Qt 的过程中 信号与槽是必不可少的部分 也是 Qt 编程的 基础 是 Qt 编程的一大创新 其实与
  • 文件通讯录

    copyright C 2014 2015 Lighting Studio Co Ltd File name Author Jerey Jobs Version 0 1 Date Description Funcion List inclu