用链表做简易的通讯录
node.h 文件
#ifndef _NODE_H_
#define _NODE_H_
#define TRUE 0
#define ERROR -1
#define FLAST -2
typedef int Data;
typedef struct _node
{
Data id;
long phone;
char name[20];
struct _node *next;
}Node;
typedef Node *Head;
//创建链表并添加联系人
int Create(Head k,Data id,long phone,char *name );
//按名字进行排序
Head SelectSort(Head pa);
//查找联系人
void Find(Head pa,char *name);
//删除联系人
void Delete(Head pa,char *name);
//打印所有联系人信息
void DisplayAll(Head k);
//打印当前创建的联系人信息
void Display(Head k);
//主菜单
int Menu();
//功能菜单
int FunMeun();
//功能选择
int Select();
#endif// _NODE_H_
node.c 文件
#include "node.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int Create(Head k,Data id,long phone,char *name )
{
if(NULL==k)
return ERROR;
Head node=(Head)malloc(sizeof(Node)/sizeof(char) );
if(NULL==node)
return FLAST;
printf("请创建用户\n");
printf("请输入ID:\n");
scanf("%d",&node->id);
printf("请输入号码:\n");
scanf("%lu",&node->phone);
printf("请输入姓名:\n");
scanf("%s",node->name);
node->next=NULL;
Head temp=k;
while(temp->next)
{
temp=temp->next;
}
temp->next=node;
return TRUE;
}
Head SelectSort(Head pa)
{
Head first;//排列后有序链表的头指针
Head tail;//排列后有序链表的尾指针
Head p_min;
Head min;//存储最小节点
Head p;//当前比较的结点
first =NULL;
while(pa!=NULL)//找链表中最小结点
{
for(p=pa,min=pa;p->next!=NULL;p=p->next)//遍历链表中的结点,找出最小结点
{
if((p->next->name)<(min->name) )//找一个比当前min小的结点
{
p_min=p;//保存找到结点的前结点p是p->next的前结点
min=p->next;//保存更小结点
}
}
if(first==NULL)//如果有序链表现在还是一个空链表
{
first=min;//第一次找到最小的结点
tail=min;//尾指针指向最后一个结点
}
else//链表中有结点
{
tail->next=min;//把最小节点放到最后
tail=min;//尾指针也要指向他
}
if(min==pa)//找到最小节点就是第一个结点
{
pa=pa->next;//如果是最小结点就把他放在第一个结点上
}
else//如果不是第一个结点
{
p_min->next=min->next;//最小结点指向当前min的next
}
}
if(first!=NULL)
{
tail->next=NULL;
}
pa=first;
return pa;
}
void Find(Head pa,char *name)
{
Head p1=pa;
Head p2=NULL;
while(p1!=NULL&&(p1->next)!=NULL)
{
p2=p1->next;
if(p2!=NULL&strcmp(p2->name,name)==0)
{
printf ("ID: %d 姓名: %s 手机号码: %lu\n", p2->id, p2->name,p2->phone);
return ;
}
else if(p2->next==NULL&&(strcmp(p2->name,name)==0))
{
printf("没有\n");
}
p1=p1->next;
}
}
void Delete(Head pa,char *name)
{
Head p1=pa;
Head p2=NULL;
while(p1!=NULL&&(p1->next)!=NULL)
{
p2=p1->next;
if(p2!=NULL&&(strcmp(p2->name,name)==0))
{
p1->next=p2->next;
free(p2);
printf("好友已删除\n");
}
else if(p2->next==NULL&&(strcmp(p2->name,name)==0))
{
printf("没有\n");
}
p1=p1->next;
}
}
void DisplayAll(Head k)
{
if(NULL==k)
return;
Head temp=k->next;
while(temp)
{
printf ("ID: %d 姓名: %s 手机号码: %lu\n", temp->id, temp->name,temp->phone);
temp=temp->next;
}
printf("\n");
}
void Display(Head k)
{
if(NULL==k)
return;
Head temp=k->next;
while(temp)
{
if(temp->next==NULL)
{
printf("用户%s已创建成功\n",temp->name);
}
temp=temp->next;
}
printf("\n");
}
int Menu()
{
printf("1.请输入\n");
printf("2.请显示\n");
printf("3.请搜索\n");
printf("4.请删除\n");
printf("0.显示主菜单\n");
}
int FunMeun()
{
printf ("\n\n");
printf (" 功能选择: \n");
printf (" \n");
printf (" 显示主菜单: 0\n");
printf (" 添加好友: 1\n");
printf (" 查看当前好友信息: 2\n");
printf (" 搜索好友: 3\n");
printf (" 删除好友: 4\n\n");
}
int Select()
{
int choice;
while (1)
{
scanf("%d", &choice);
if (!(choice>=0 && choice<=4))
{
printf ("\n\t输入错误,重选0-4:\n\n");
continue;
}
else
{
break;
}
}
return choice;
}
main.c文件
#include "node.h"
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int id;
long phone;
char name[20];
Head head_node=(Head)malloc(sizeof(Node)/sizeof(char));
if(head_node==NULL)
{
return ERROR;
}
head_node->next=NULL;
Menu();
while(1)
{
scanf("%d",&n);
switch(n)
{
case 0:
{
Menu();
}
break;
case 1:
{
if(head_node)
{
if(Create(head_node, id, phone,name )!=TRUE)
{
return ERROR;
}
}
Display(head_node);
head_node= SelectSort(head_node);
FunMeun();
}
break;
case 2:
{
DisplayAll(head_node);
FunMeun();
}
break;
case 3:
{
printf("请输入你要查找的姓名\n");
scanf("%s",name);
Find(head_node,name);
FunMeun();
}
break;
case 4:
{
printf("请输入你要删除的姓名\n");
scanf("%s",name);
Delete(head_node,name);
FunMeun();
}
break;
default:
{
return ERROR;
}
}
}
return 0;
}