通讯录

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
#include<string.h>

struct person {//构建结构体
    char name[32];     
    char phone[12];     
    char gender[5];     
    unsigned char age;  
    char adress[20];
    struct person *next;
}; 

int menu()
{
       int n = 0;
       printf("\n");
       printf("*************************\n");
       printf("***     通讯录系统    ***\n");
       printf("***1.添加       2.删除***\n");
       printf("***3.查找       4.修改***\n");
       printf("***5.显示       6.清空***\n");
       printf("***7.排序       0.退出***\n");
       printf("*************************\n");
       printf("请选择功能:");
       scanf("%d",&n);
       return n;

}
void  insert(struct person **head)
{

    int i = 0;
    int n = 0;
    assert(head != NULL);   
    printf("请输入所添加人数");
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
    struct person *p = (struct person*)malloc(sizeof(struct person));
    p ->next = NULL;
    printf("name:");
    scanf("%s",p ->name);
    printf("gender:");
    scanf("%s",p ->gender);
    printf("age:");
    scanf("%d",&p ->age);
    printf("phone:");
    scanf("%s",p ->phone);
    printf("adress:");
    scanf("%s",p ->adress);
    printf("\n");
    p->next = *head;
    *head = p;

    }
}
void   print(struct person *head)
{   
    while(head != NULL){

        printf("name:%s,gender:%s,age:%d,phone:%s,adress:%s",head->name,head->gender,
            head->age,head->phone,head->adress);
        printf("\n");
        head = head->next;

    }


}
void  Drop(struct person **head)

 {  
    char name[32];
    struct person *pre = NULL;
    struct person *cur = *head;
    assert(*head != NULL);
    printf("请输入要删除的人的名字:");
    scanf("%s", name);

    while ( cur != NULL ) 
    {
        if ( strcmp(cur->name, name) == 0)
            break;
        pre = cur; // 将当前节点付给pre 
        cur = cur->next; // 当前节点走向下一个 
    } 

    if ( pre == NULL ) 
    { // 第一个节点 
        *head = cur->next; // 让头指针指向第二个节点 
        free(cur); // 释放当前节点 
    } 
    else 
    { // 不是第一个节点 
        if ( cur != NULL ) 
        { 
            pre->next = cur->next;
            free(cur);
        } 
        else  // 防止没有找到,cur为NULL 
            printf("查无此人");
    }
} 

void  find(struct person *head)
{   
    struct person *cur = head;
    char name[32];
    printf("姓名:");
    scanf("%s", name);
    while ( cur != NULL  )
    {
        if ( strcmp(cur->name, name) == 0 ) {
            printf("name:%s,gender:%s,age:%d,phone:%s,adress:%s",cur->name,cur->gender,
            cur->age,cur->phone,cur->adress);
            break;
        } 
        cur = cur->next;
    }
    if ( cur == NULL ) {
        printf("查无此人\n"); 
    }


}
void sort(struct person *head)//按名字排序
{
    struct person *cur = head;
    struct person *p = cur;
    while ( cur != NULL  ) {
        p = cur;
        while (p != NULL ) {
            if ( strcmp(p->name ,cur->name) < 0 ) {
                char tmp[100];
                int k = 0;
                strcpy(tmp, p->name);
                strcpy(p->name, cur->name);
                strcpy(cur->name, tmp);
                strcpy(tmp, p->gender);
                strcpy(p->gender, cur->gender);
                strcpy(cur->gender, tmp);
                k = p->age;
                p->age = cur->age;
                cur->age = k;
                strcpy(tmp, p->phone);
                strcpy(p->phone, cur->phone);
                strcpy(cur->phone, tmp);
                strcpy(tmp, p->adress);
                strcpy(p->adress, cur->adress);
                strcpy(cur->adress, tmp);

            }
            p = p->next;
        }

        cur = cur->next; 
    }
}
void revise(struct person **head)//按名字修改
{
     struct person *cur = *head;
     char name[32];
     assert(*head != NULL);
     printf("请输入想修改信息的人的名字:");
     scanf("%s",name);
     while(cur != NULL )
     {
         if(strcmp(cur->name,name))
         {
            printf("请输入新联系人的名字:");  
            scanf("%s", cur->name);            
            printf("请输入新联系人的性别:");
            scanf("%s", cur->gender);
            printf("请输入新联系人的年龄:");  
            scanf("%d", &cur->age);           
            printf("请输入新联系人的电话:");  
            scanf("%s", cur->phone);  
            printf("请输入新联系人的地址:");  
            scanf("%s", cur->adress);  
            break;  
         }
         cur = cur->next;
     }
    if(cur == NULL)
        printf("查无此人\n");
}

void empty(struct person **head)
{

    struct person *cur = *head;
    assert(*head != NULL);
    while ( cur != NULL ) {
        struct person *nxt = cur->next;
        free(cur);
        cur = nxt;
    }
     *head = NULL;

}
int main()
{
   int i = 0;
   struct person *head = NULL;
   do{
       i = menu();
       switch( i ){

           case 1:
               insert(&head);
               break;
           case 2:
               Drop(&head);
               break;
           case 3:
               find(head); 
               break;
           case 4:
               revise(&head);
               break;
           case 5:
               print(head);
               break;
           case 6:
               empty(&head);
               break;
           case 7: 
               sort(head);
               break;
           case 0:
               printf("退出\n");
               break;
           default:
               printf("输入有误\n");
               break;

       }  

   }while(i);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值