1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<string.h>  
  4. typedef struct DIR{  
  5.   char name[50];  
  6.   char clas[20];  
  7.   char teleNum[15];  
  8.    struct DIR *next;  
  9. } Dir ,*pDir;  
  10. void Init(pDir *h){//初始化头指针   
  11.   *h = ( Dir *)malloc(sizeof( Dir));  
  12.    memset(*h, 0, sizeof( Dir));  
  13.   (*h) -> next = NULL;  
  14. }  
  15. void Input(Dir *p)  
  16. {  
  17.    printf("输入姓名:");  
  18.    scanf("%s",p->name);  
  19.    printf("输入班级:");  
  20.    scanf("%s",p->clas);  
  21.    printf("输入电话号码:");  
  22.    scanf("%s",p->teleNum);  
  23. }  
  24. void add(pDir *head){//添加成员   
  25.    Dir *p = *head ;  
  26.   int conti = 1;  
  27.   while((p -> next)!=NULL){  
  28.     p = p -> next;  
  29.   }  
  30.     
  31.   while(1){  
  32.     printf("键入1继续录入(0-1):");  
  33.     scanf("%d",&conti);  
  34.     if(!conti){  
  35.        printf("退出通讯录的录入!\n");  
  36.        break;  
  37.     }  
  38.     p -> next = ( Dir *)malloc(sizeof( Dir));  
  39.     Input(p->next);  
  40.     p = p -> next;  
  41.   }  
  42.    p -> next = NULL;  
  43. }  
  44.  
  45. int del( Dir *head, char *ne){//删除成员   
  46.     Dir *p = head;  
  47.     Dir *q = NULL;  
  48.     int status = 0;  
  49.    while(p!=NULL && (p -> next)!=NULL){  
  50.       q = p -> next;  
  51.       if(q!=NULL && strcmp(q->name, ne)==0){  
  52.          p -> next = q -> next;  
  53.          free(q);  
  54.          status++ ;  
  55.         // break;  
  56.       }  
  57.       p = p -> next;  
  58.    }  
  59.    return status;  
  60. }  
  61. void query( Dir *head, char* ne){//查询成员   
  62.     Dir *p = head ->  next;  
  63.    int Founded = 0;  
  64.    while(p!=NULL){  
  65.       if(strcmp(p->name, ne)==0){  
  66.         printf("姓名:%s 班级:%s 电话号码:%s\n",p->name,p->clas,p->teleNum);  
  67.         Founded = 1;  
  68.       }  
  69.       p = p -> next;  
  70.    }  
  71.    if(!Founded){  
  72.       printf("0个记录!\n");  
  73.    }  
  74. }  
  75. void print(Dir *head){//打印通讯录   
  76.     Dir *p = head -> next;  
  77.    if(p==NULL)  
  78.      printf("链表为空!\n");  
  79.    while(p!=NULL){  
  80.       printf("姓名:%s 班级:%s 电话号码:%s\n",p->name,p->clas,p->teleNum);  
  81.       p = p -> next;  
  82.    }  
  83. }  
  84. void push_back( Dir *head, Dir *insert){//在末尾插入同学   
  85.     Dir *p = head;  
  86.    while((p -> next)!=NULL){  
  87.      p = p -> next;  
  88.    }  
  89.    p -> next = insert;  
  90.    insert -> next = NULL;  
  91. }  
  92.  
  93.  
  94. void push_front( Dir *head, Dir *insert){//在列表头插入同学  
  95.     Dir *p = head -> next;  
  96.    head -> next = insert;  
  97.    insert -> next = p;   
  98. }  
  99. void InitNew(pDir *m_new)  
  100. {  
  101.     *m_new = (Dir *)malloc(sizeof(Dir));  
  102.     Input(*m_new);  
  103. }  
  104. int main()  
  105. {  
  106.     Dir *head, *p;  
  107.     char tmp[50];  
  108.     int num = 0;  
  109.     Init(&head);  
  110.     printf("1.进行通讯录的录入:\n");  
  111.     add(&head);  
  112.       
  113.     printf("2.打印通讯录:\n");  
  114.     print(head);  
  115.       
  116.     printf("进行通讯录的查询(以姓名查询):\n");   
  117.     printf("输入姓名:");  
  118.     scanf("%s",tmp);  
  119.     query(head,tmp);  
  120.       
  121.     printf("删除通讯录成员:(以姓名删除)\n");  
  122.     scanf("%s",tmp);  
  123.     if(num = del(head, tmp)){  
  124.       printf("删除%d个记录!\n",num);  
  125.     }  
  126.     else{  
  127.       printf("没有此项记录\n");  
  128.     }  
  129.     printf("3.在表尾添加:\n");  
  130.     InitNew(&p);  
  131.     push_back(head, p);  
  132.       
  133.     printf("添加后,通讯录内容为:\n");  
  134.     print(head);  
  135.       
  136.     printf("4.在表头添加:\n");  
  137.     InitNew(&p);  
  138.     push_front(head, p);  
  139.       
  140.     printf("添加后,通讯录内容为:\n");  
  141.     print(head);  
  142.       
  143.     system("pause");  
  144.     return 0;  
  145. }