通信录(

来源:百度文库 编辑:神马文学网 时间:2024/04/16 19:11:13
限于水平,代码可能有些不足之处,希望有人能补充,谢谢!代码如下:#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct student)
#define L 100struct student
{
 char name[L];
 char tel[L];
 struct student * next;
};int n , m, i;void operation()

 printf("     ***通信录操作界面***\n\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("|选项(按 0)----------(其他)退出|\n\n");
}struct student * creat(void)       /*通信录的建立*/
{
 struct student * h;
 struct student * p,*q;
printf(" 请输入要增加的个数:\n");
scanf("%d",&m);
 h = NULL;
 if(m > 0)
 { 
  q = p = (struct student *) malloc(LEN);
  
  for(i = 0;i < m;i++)
  {
   
   p = (struct student *) malloc(LEN);
   printf(" 姓  名:");
   scanf("%s",p -> name);
   printf(" 电话号码:");
   scanf("%s",p -> tel);
   q -> next = p;
   if(i == 0)
    h = p;
   q = p;
  }
 q -> next = NULL;
 }
 else  
 {
  printf(" 输入有误!\n");
  creat();
 }
 return h;
}struct student * add(void)       /*添加信息*/
{
 struct student * p;
 p = NULL;   
 p = (struct student *) malloc(LEN);
 printf(" 姓名:");
 scanf("%s",p -> name);
 printf(" 电话号码:");
 scanf("%s",p -> tel);
 p -> next = NULL;
 return p;
}void print(struct student * h)     /*通信录的输出*/
{
 struct student * p;
 p = h;
 if(h != NULL)
 {
  printf("| 姓名      电话号码           |\n");
  while(p != NULL)
  {
   printf("| %-10s%-19s|\n",p -> name,p -> tel);
   p = p -> next;
  }
 }
 else printf("|                              |\n");}struct student *insert(struct student * h,struct student * inname,int n)/*信息的插入*/
{
 struct student * p,* q,* in;int i = 1;
 in = inname;
 p = h;
 if(h == NULL)
 {
  h = in;
  in ->next = NULL;
 }
 else
 {
  if(n == 1)
  {
   h = in;
   in -> next = p;
   printf("添加成功!\n");
  }
  else if(n > 1)
  {
   while(i != n || p -> next != NULL )
   {
    q = p;p = p -> next;i ++;
   }
   if(i == n)
   {
    q -> next = in;
    in -> next = p;
    printf("添加成功!\n");
   }
   
    if(i < n)
   {
    p -> next = in;
    in -> next = NULL;
    printf("你的通信录只有 %d 信息!\n",i);
    printf("已默认添加到最后一个了!\n");
   } 
  }
  else
  {
   p -> next = in;
   in -> next = NULL;
   printf("已默认添加到最后一个了!\n");
  } 
  
 }
 return h;
}
struct student * del(struct student *h,char delname[])/*信息的删除*/
{
 struct student * p,*q;
 if(h ==NULL)
  printf("通信录为空!\n");
 p = h;
 while(*delname != *p -> name && p -> next != NULL)
 {
  q = p;p = p -> next;
 }
 if(*delname == *p -> name)
 {
  if(p == h)
   h = p -> next;
  else q -> next = p -> next;
  printf("删除成功!\n\n");
  n = n - 1;
 }
 else printf("%s 在你的通信录中找不到!\n\n",delname);
 return h;
}void find(struct student * h,char fname[])/*信息的查找*/
{
 struct student * p;
 if(h ==NULL)
  printf("通信录为空!\n");
 else
 {
  p = h;
  while(*fname != *p -> name && p -> next != NULL)
  p = p -> next;
  if(*p -> name == *fname)
   printf(" %s  的电话号码是: %s\n",p -> name,p -> tel);
  else printf("在你的通信录中找不到 %s 的信息!\n",fname);
 }
}
struct student * change(struct student *h,char cname[])/*信息的更改*/
{
 struct student * p;
 if(h ==NULL)
  printf("通信录为空!\n");
 else
 {
  p = h;
  while(*cname != *p -> name && p -> next != NULL)
   p = p -> next;
  if(*p -> name == *cname)
  {
   printf("输入电话号码:");
   scanf("%s",&p -> tel);
   printf("更改成功!\n");
  }
  else printf("在你的通信录中找不到 %s 的信息!\n",cname);
 }
 return h;
} void select(struct student * head)          /*程序提示之对通信录进行什么样的操作*/
{
 void interf();
 void select1();
 struct student *inname;
 char delname[L],fname[L],cname[L];
 int N,No;
 operation();
 scanf("%d",&N);
 if(head != NULL || N == 0 || N == 1 || N ==2)
 {
  if(N == 1)
  {
   head = creat();
   select1(head);
  }
  else if (N == 2)
  {
   inname = (struct student *) malloc(LEN);
   printf("输入你要增加的联系人的姓名和电话号码\n");
   inname = add();
   printf("输入你要添加到通信录的第几个位置!\n");
   scanf("%d",&No);
   insert(head,inname,No);      /*调用单链表的插入*/
   select1(head);
  }
   else if(N == 3)
   {
    printf("输入你要删除的联系人的姓名!\n");
    scanf("%s",delname);
    head = del(head,delname);    /*调用单链表的删除*/
    select1(head);
   }
    else if(N == 4)
    {
     select1(head);     /*调用单链表的输出*/
    }
     else if(N == 5)
     {
      printf("输入你要查找的联系人的姓名!\n");
      scanf("%s",fname);
      find(head,fname);
      select1(head);
     }
      else if(N == 6)
      {
       printf("输入你要修改的联系人的姓名!\n");
       scanf("%s",cname);
       change(head,cname);
       select1(head);
      }
       else if(N == 0)
        select(head);
        else
        {
         printf("  输入错误!请重新选择你将要进行的操作!\n");
         select(head); 
        }
 }
 else select1(head);
}void interf(struct student * HH)
{
 printf("       ***通信录主界面***\n\n");
 printf("|  **********通信录**********  |\n");
 printf("|  ==========================  |\n");
 printf("|                              |\n");
 print(HH);
 printf("|  =========================== |\n");
 printf("|选项(按 0)----------(其他)退出|\n\n");
}
 void select1(struct student *h)             /*程序提示之是否对通信录进行操作*/
{
 int m;
 interf(h);
 scanf("%d",&m);
 if(m == 0)
  select(h);
 else   ;
}void main()
{
 struct student * H;
 
 H = NULL;
 select1(H);
} 结束