1. 程式人生 > >連結串列實現功能強大的通訊錄

連結串列實現功能強大的通訊錄

/*****************************************************
copyright (C), Nanjing University of ZiJin
File name:txl.c
Author: CaoMengDe  Version:0.1    Date: 2016-12-13 17:29
Description:
Funcion List: 
*****************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0


typedef int ElementType;
typedef int Status;


typedef struct node
{
    char name[20];
    ElementType age;
    char sex[10];
    char phonenumber[20];
    struct node *next;


}Node;


Status Menu(Node* head);
Status Menuupdate(Node* head);
Status Menudelete(Node* head);
Status Menuquery(Node* head);
int Length(Node* head);
Status init(Node** head);
Status inserttail(Node* head);
Status deleteindex(Node* head);
Status deletename(Node* head);
Status deletephonenumber(Node* head);
Status updateindex(Node* head);
Status updatename(Node* head);
Status updatephone(Node* head);
void queryindex(Node* head);
void queryname(Node* head);
void queryphonenumber(Node* head);
void print(Node* head);
void sort(Node* head);


int main(int argc, char **argv)
{
    int ret;
char flag;
    Node* head;
    ret = init(&head);
    if(ERROR == ret)
    {
        return -1;
    }

Menu(head);
    sort(head);
    print(head);


    return 0;
}




//主選單


Status Menu(Node* head)
{
int number;
printf("歡迎來到Coder通訊錄!\n");
printf("\n");
printf("1:新增聯絡人\n");
printf("\n");
printf("2:刪除聯絡人\n");
printf("\n");
printf("3:修改聯絡人資訊\n");
printf("\n");
printf("4:查詢通訊錄資訊\n");
printf("\n");
printf("5:彈出操作提示\n");
printf("\n");
    printf("q:退出選單\n");
printf("\n");
printf("請輸入指令\n");

while(scanf("%d", &number) == 1)
    {
   
   switch(number)
   {
   case 1:
   {
       inserttail(head);
       break;
   }
   case 2:
   {
   Menudelete(head);
   break;
   }
   case 3:
   {
   Menuupdate(head);
   break;
   }
   case 4:
   {
   Menuquery(head);
   break;
   }
case 5:
{
printf("1:新增聯絡人\n");
           printf("\n");
           printf("2:刪除聯絡人\n");
           printf("\n");
           printf("3:修改聯絡人資訊\n");
           printf("\n");
           printf("4:查詢通訊錄資訊\n");
           printf("\n");
                printf("q:退出選單\n");
           printf("\n");
           printf("請輸入數字\n");
break;
}
default: printf("請重新輸入正確的操作指令\n");
   }

   
    }
    return OK;
}
 


 //修改方式選單
 
Status Menuupdate(Node* head)
{
int ret;
int number;
printf("1.根據編號進行修改\n");
printf("\n");
    printf("2.根據姓名進行修改\n");
printf("\n");
    printf("3.根據手機號碼進行修改\n");
printf("\n");
printf("請輸入你想選擇的功能號碼\n");
scanf("%d", &number);
switch(number)
{
case 1:
{
updateindex(head);
break;
}

case 2:
{
updatename(head);
break;
}

case 3:
{
updatephone(head);
break;
}
}
return OK;


}
 
 
 //刪除子選單
 
 Status Menudelete(Node* head)
 {
int ret;
int number;
printf("1.根據編號進行刪除\n");
printf("\n");
    printf("2.根據姓名進行刪除\n");
printf("\n");
    printf("3.根據手機號碼進行刪除\n");
printf("\n");
printf("請輸入你想選擇的功能號碼\n");
scanf("%d", &number);
switch(number)
{
case 1:
{
deleteindex(head);
break;
}

case 2:
{
deletename(head);
break;
}

case 3:
{
deletephonenumber(head);
break;
}
}
return OK;


 }
 
 
 //查詢子選單
 
 Status Menuquery(Node* head)
 {
int number;
printf("1.根據編號進行查詢\n");
printf("\n");
    printf("2.根據姓名進行查詢\n");
printf("\n");
    printf("3.根據手機號碼進行查詢\n");
printf("\n");
printf("請輸入你想選擇的功能號碼\n");
scanf("%d", &number);
switch(number)
{
case 1:
{
queryindex(head);
break;
}

case 2:
{
queryname(head);
break;
}

case 3:
{
queryphonenumber(head);
break;
}
}
return OK;


 }
 
 
 //初始化
 
Status init(Node** head)
{
     Node* new = (Node*)malloc(sizeof(Node));
     if(NULL == new)
     {
         return ERROR;
     }
     *head = new;
     (*head)->next = NULL;
     return OK;
}




//尾插法


Status inserttail(Node* head)
{

while(head->next != NULL)
    {
        head = head->next;
    }
Node* new = (Node*)malloc(sizeof(Node));
if(NULL == new)
{
return ERROR;
}
head->next = new;
new->next = NULL;

printf("請輸入新增成員姓名:\n");
scanf("%s", new->name);
printf("請輸入成員性別:\n");
scanf("%s", new->sex);
printf("請輸入成員年齡:\n");
scanf("%d", &new->age);
printf("請輸入成員手機號碼:\n");
scanf("%s", new->phonenumber);
printf("新增成功!\n");
return OK;


}




//按照編號刪除


Status deleteindex(Node* head)
{
int i, index;
printf("請輸入刪除第幾個\n");
scanf("%d", &index);
if(index < 1||index > Length(head))
{
printf("選擇範圍錯誤,重新輸入\n");
return ERROR;
}


    for(i = 0; i < index - 1; i++)
    {
        head = head->next;
    }
    Node* temp = head->next;
    head->next = head->next->next;
    free(temp);
    temp = NULL;
printf("刪除成功!\n");
    return OK;
}




//按照姓名刪除


Status deletename(Node* head)
{
char temp[20];
int count = 0;
printf("請輸入想刪除的姓名\n");
scanf("%s", &temp);
while(head->next != NULL)
{
if(strcmp(head->next->name, temp) == 0)
{
Node* temp = head->next;
head->next = head->next->next;
free(temp);
temp = NULL;
count++;
}
head = head->next;
}
if(count == 0)
{
printf("沒有該成員資訊\n");
return ERROR;
}
memset(temp, 0, 20);
printf("刪除成功!\n");
return OK;
}




//按照手機號碼刪除


Status deletephonenumber(Node* head)
{
char temp[20];
int count = 0;
printf("請輸入想刪除的電話號碼\n");
scanf("%s", &temp);
while(head->next != NULL)
{
if(strcmp(head->next->phonenumber, temp) == 0)
{
Node* temp = head->next;
head->next = head->next->next;
free(temp);
temp = NULL;
count++;
}
head = head->next;
}
if(count == 0)
{
printf("沒有該成員資訊\n");
return ERROR;
}
memset(temp, 0, 20);
printf("刪除成功!\n");
return OK;
}


//根據編號修改對應資訊


Status updateindex(Node* head)
{
int i, index, shuzi;
printf("請輸入想修改資訊的編號\n");
scanf("%d", &index);
if(index < 1||index > Length(head))
{
printf("選擇範圍錯誤,重新輸入\n");
return ERROR;
}
for(i = 0; i < index; i++)
{
head = head->next;
}
printf("\n");
printf("1.只修改姓名\n");
printf("\n");
printf("2.只修改性別\n");
printf("\n");
printf("3.只修改年齡\n");
printf("\n");
    printf("4.只修改手機號碼\n");
    printf("\n");
printf("5.修改全部資訊\n");
printf("\n");
printf("請輸入數字\n");
scanf("%d\n", &shuzi);
switch(shuzi)
{
case 1:
{
   scanf("%s", head->name);
printf("修改成功!\n");
break;
}
case 2:
{
   scanf("%s", head->sex);
printf("修改成功!\n");
break;
}
case 3:
{
   scanf("%d", &head->age);
printf("修改成功!\n");
break;
}
case 4:
{
   scanf("%s", head->phonenumber);
        printf("修改成功!\n");
break;
}
case 5:
{
        getchar();
printf("請輸入新成員姓名:\n");
   scanf("%s", head->name);
   printf("請輸入新成員性別:\n");
   scanf("%s", head->sex);
   printf("請輸入新成員年齡:\n");
   scanf("%d", &head->age);
   printf("請輸入新成員手機號碼:\n");
   scanf("%s", head->phonenumber); 
   printf("修改成功!\n");
break;
}
default :printf("請重新輸入\n");
}

    return OK;

}






//根據姓名修改對應資訊


Status updatename(Node* head)
{
char temp[20];
int shuzi, count = 0;
printf("請輸入想修改資訊的姓名\n");
scanf("%s", &temp);
while(head->next != NULL)
{
head = head->next;
if(strcmp(head->name, temp) == 0)
{
            printf("\n");
       printf("1.只修改姓名\n");
       printf("\n");
printf("2.只修改性別\n");
printf("\n");
printf("3.只修改年齡\n");
printf("\n");
printf("4.只修改手機號碼\n");
printf("\n");
printf("5.修改全部資訊\n");
printf("\n");
printf("請輸入數字\n");
scanf("%d\n", &shuzi);
switch(shuzi)
{
case 1:
{
scanf("%s", head->name);
printf("修改成功!\n");
break;
}
case 2:
{
scanf("%s", head->sex);
printf("修改成功!\n");
break;
}
case 3:
{
scanf("%d", &head->age);
printf("修改成功!\n");
break;
}
case 4:
{
scanf("%s", head->phonenumber);
printf("修改成功!\n");
break;
}
case 5:
{
getchar();
printf("請輸入新成員姓名:\n");
scanf("%s", head->name);
printf("請輸入新成員性別:\n");
scanf("%s", head->sex);
printf("請輸入新成員年齡:\n");
scanf("%d", &head->age);
printf("請輸入新成員手機號碼:\n");
scanf("%s", head->phonenumber); 
printf("修改成功!\n");
break;
}
default :printf("請重新輸入\n");
}
count++;
}
}
if(count == 0)
{
printf("沒有該成員資訊\n");
return ERROR;
}
memset(temp, 0, 20);
return OK;
}






//根據手機號碼修改對應資訊


Status updatephone(Node* head)
{
char number[20];
int shuzi, count = 0;
printf("請輸入想修改資訊的手機號碼\n");
scanf("%s", &number);
while(head->next != NULL)
{
head = head->next;
if(strcmp(head->phonenumber, number) == 0)
{
printf("\n");
printf("1.只修改姓名\n");
printf("\n");
printf("2.只修改性別\n");
printf("\n");
printf("3.只修改年齡\n");
printf("\n");
printf("4.只修改手機號碼\n");
printf("\n");
printf("5.修改全部資訊\n");
printf("\n");
printf("請輸入數字\n");
scanf("%d\n", &shuzi);
switch(shuzi)
{
case 1:
{
scanf("%s", head->name);
printf("修改成功!\n");
break;
}
case 2:
{
scanf("%s", head->sex);
printf("修改成功!\n");
break;
}
case 3:
{
scanf("%d", &head->age);
printf("修改成功!\n");
break;
}
case 4:
{
scanf("%s", head->phonenumber);
printf("修改成功!\n");
break;
}
case 5:
{
getchar();
printf("請輸入新成員姓名:\n");
scanf("%s", head->name);
printf("請輸入新成員性別:\n");
scanf("%s", head->sex);
printf("請輸入新成員年齡:\n");
scanf("%d", &head->age);
printf("請輸入新成員手機號碼:\n");
scanf("%s", head->phonenumber); 
printf("修改成功!\n");
}
default :printf("請重新輸入\n");

count++;
}
}

if(count == 0)
{
printf("沒有該成員資訊\n");
return ERROR;
}
memset(number, 0, 20);
return OK;


}






//按編號查詢


void queryindex(Node* head)
{
int i, index;
printf("請輸入想查詢資訊的編號:\n");
scanf("%d", &index);
if(index < 1||index > Length(head))
{
printf("選擇範圍錯誤,重新輸入\n");
}
for(i = 0; i < index - 1; i++)
{
head = head->next;
}
printf("查詢資訊:\n");
printf("姓名:%s\t", head->next->name);
printf("性別:%s\t", head->next->sex);
printf("年齡:%d\t", head->next->age);
printf("手機號碼:%s\n", head->next->phonenumber);
printf("--------------------------------------");


}




//按姓名查詢


void queryname(Node* head)
{
char temp[20];
int count = 0;
printf("請輸入想查詢資訊的姓名\n");
scanf("%s", &temp);
while(head->next != NULL)
{
if(strcmp(head->next->name, temp) == 0)
{
printf("查詢資訊:\n");
       printf("姓名:%s\t", head->next->name);
       printf("性別:%s\t", head->next->sex);
       printf("年齡:%d\t", head->next->age);
       printf("手機號碼:%s\n", head->next->phonenumber);
       printf("--------------------------------------\n");
count++;
}

head = head->next;
}
if(count == 0)
{
printf("沒有該成員資訊\n");

}
memset(temp, 0, 20);

}




//按照手機號碼查詢


void queryphonenumber(Node* head)
{
char temp[20];
int count = 0;
printf("請輸入想查詢資訊的手機號碼\n");
scanf("%s", &temp);
while(head->next != NULL)
{
if(strcmp(head->next->phonenumber, temp) == 0)
{
printf("查詢資訊:\n");
       printf("姓名:%s\t", head->next->name);
       printf("性別:%s\t", head->next->sex);
       printf("年齡:%d\t", head->next->age);
       printf("手機號碼:%s\n", head->next->phonenumber);
       printf("--------------------------------------\n");
count++;
}

head = head->next;
}
if(count == 0)
{
printf("沒有該成員資訊\n");

}
memset(temp, 0, 20);

}




//根據姓名排序
void sort(Node* head)
{
    int i,j;
char n[20];
char t[20];
char s[10];
    for( i = 0; i < Length(head) - 1; i++)
    {
        Node* temp = head;
        for(j = 0; j < Length(head) - 1 - i;j++)
        {
            if(strcmp(temp->next->name , temp->next->next->name) > 0 )
            {    
       strcpy(n, temp->next->name);
strcpy(temp->next->name, temp->next->next->name);
strcpy(temp->next->next->name, n);

strcpy(t, temp->next->phonenumber);
strcpy(temp->next->phonenumber, temp->next->next->phonenumber);
strcpy(temp->next->next->phonenumber, t);

strcpy(s, temp->next->sex);
strcpy(temp->next->sex, temp->next->next->sex);
strcpy(temp->next->next->sex, s);

                int t = temp->next->age;
                temp->next->age = temp->next->next->age;
                temp->next->next->age = t;

            }
             temp = temp->next;
        }
            
       
    }
}


void print(Node* head)
{
while(head->next != NULL)
{
printf("姓名:%s\t", head->next->name);
printf("性別:%s\t", head->next->sex);
printf("年齡:%d\t", head->next->age);
printf("手機號碼:%s\n", head->next->phonenumber);
head = head->next;
}
}




int Length(Node* head)
{
int count = 0;
while(head->next != NULL)
{
count++;
head = head->next;
}
return count;
}