初学者 第一次写通讯录,写到头皮发麻。
灵活运用指针函数,返回值为指针
注意使用二级指针操作头指针head
注意del函数的判断条件
切记不骄不躁!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define LEN sizeof(struct information)
//定义结构体
typedef struct information
{
char name[20];
char id[20];
char phone[20];
char home[20];
struct information *next;
}INFO;
//主菜单函数
void face()
{
printf("******address list*****\n");
printf("1:show all information\n");
printf("2:add information\n");
printf("3:delete information\n");
printf("4:modify information\n");
printf("5:search information\n");
printf("0:quit\n");
printf("***********************\n");
}
//显示所有联系人
INFO *print(INFO *head)
{
INFO *p;
p = head;
//system("clear");
if(head != NULL)
{
printf("***********************\n");
printf("members are as follow!\n");
while(p != NULL)
{
printf("name:%s\t",p->name);
printf("id:%s\t",p->id);
printf("phone:%s\t",p->phone);
printf("home:%s\n",p->home);
p = p->next;
}
}
else
{
printf("***********************\n");
printf("address_list is none!\n");
}
return head;
}
//增加联系人函数
INFO *add(INFO *head)
{
INFO *new_node = (INFO*)malloc(LEN);
printf("***********************\n");
printf("please input name!\n");
scanf("%s",new_node->name);
printf("please input id!\n");
scanf("%s",new_node->id);
printf("please input phone!\n");
scanf("%s",new_node->phone);
printf("please input home!\n");
scanf("%s",new_node->home);
printf("successfully added!\n");
INFO * p;
p = head;
if(head == NULL) //当通讯录为空时
{
head = new_node;
new_node->next = NULL;
}
else //不为空
{
while(p->next !=NULL)
{
p = p->next;
}
p->next = new_node;
new_node->next = NULL;
}
return (head);
}
//删除联系人函数
INFO *del(INFO ** head)
{
char key[20];
printf("please input name!\n");
scanf("%s",key);
INFO * p;
INFO * q;
p = *head;
q = *head;
if(*head == NULL) //当通讯录为空时
{
printf("***********************\n");
printf("it is empty!\n");
}
else
{
if(0 == strcmp((*head)->name,key)) //当要是删除第一个联系人时
{
*head = (*head)->next;
printf("delete sucessfully!\n");
}
else
{
while(p->next != NULL && 0 != strcmp(p->name,key))
{
q = p;
p = p->next;
}
if(p->next ==NULL && 0 == strcmp(p->name,key)) //最后一个为要删除的人时
{
q->next = NULL;
free(p);
printf("del sucessfully!\n");
}
if(p->next !=NULL&& 0 == strcmp(p->name,key)) //不是最后一个
{
q->next = p->next;
free(p);
printf("del sucessfully!\n");
}
if(p->next !=NULL&& 0 != strcmp(p->name,key)) //找不到这样的人
{
printf("no such person!\n");
}
}
return *head;
}
}
//第二种方法
/* INFO *p1;
INFO *p2;
p1 = head;
p2 = head;
if(head != NULL)
{
while(p1 !=NULL)
{
if(0 == strcmp(p1->name,key))
{
if(head != p1)
{
p2->next = p1->next;
}
else
{
head = p1->next;
}
free(p1);
printf("delete sucessfully!\n");
return head;
}
else
{
p2 = p1;
p2->next = p1;
}
}
printf("no such person!");
}
else
{
printf("it is empty!\n");
return head;
}
}*/
//修改联系人信息
INFO *modify(INFO *head)
{
INFO *p, *q;
char key[20];
p = head;
q = head;
printf("please input name!\n");
printf("****************************\n");
scanf("%s",key);
if(head != NULL)
{
while(p->next != NULL)
{
if(0 == strcmp(p->name,key)) //非最后一个人是要修改的人时
{
printf("the perseon's info as follow:\n");
printf("modify name %s:\n",p->name);
scanf("%s",p->name);
printf("modify id%s:\n",p->id);
scanf("%s",p->id);
printf("modify phone%s:\n",p->phone);
scanf("%s",p->phone);
printf("modify home%s:\n",p->home);
scanf("%s",p->home);
printf("\n");
return head;
}
else
{
q = p;
p = p->next;
}
}
if(p->next ==NULL&& 0 == strcmp(p->name,key)) //最后一个人是要修改的人时
{
printf("the perseon's info as follow:\n");
printf("modify name %s:\n",p->name);
scanf("%s",p->name);
printf("modify id%s:\n",p->id);
scanf("%s",p->id);
printf("modify phone%s:\n",p->phone);
scanf("%s",p->phone);
printf("modify home%s:\n",p->home);
scanf("%s",p->home);
printf("\n");
return head;
}
else //找不到这样的人
{
printf("no such person\n");
}
}
else
{
printf("address_list is empty!\n");
}
}
//查找联系人函数
INFO *search(INFO *head)
{
INFO *p, *q;
char key[20];
p = head;
q = head;
printf("please input name!\n");
printf("****************************\n");
scanf("%s",key);
if(head != NULL) //当通讯录为空时
{
while(p->next != NULL)
{
if(0 == strcmp(p->name,key)) //非最后一个人是要查找的人时
{
printf("the perseon's info as follow:\n");
printf("name:%s\t",p->name);
printf("id:%s\t",p->id);
printf("phone:%s\t",p->phone);
printf("home:%s\t",p->home);
printf("\n");
return head;
}
else
{
q = p;
p = p->next;
}
}
if(p->next ==NULL&& 0 == strcmp(p->name,key)) //最后一个人是要查找的人时
{
printf("the perseon's info as follow:\n");
printf("name:%s\t",p->name);
printf("id:%s\t",p->id);
printf("phone:%s\t",p->phone);
printf("home:%s\t",p->home);
printf("\n");
return head;
}
else //找不到这样的人
{
printf("no such person\n");
}
}
else
{
printf("address_list is empty!\n");
}
}
int main()
{
int choose;
INFO *head = NULL;
//system("clear");
while(1)
{
face();
printf("please input your choose!\n");
scanf("%d",&choose);
switch(choose)
{
case 0:return 0;
case 1:head = print(head);
break;
case 2:head = add(head);
break;
case 3:head = del(&head);
break;
case 4:head = modify(head);
break;
case 5:head = search(head);
break;
default:printf("input error!\n");
break;
}
}
}