头文件包含的内容:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
char name[20];
char sex;
int age;
char tel[20];
char ad[40];
struct LNode * next;
}LNode, *LinkList;
LinkList LinkInit();
void Add(LinkList L,int n);
void Delete(LinkList L);
void Search(LinkList L);
void Modify(LinkList L);
void Show(LinkList L);
void ClearAll(LinkList); //清空所有联系人
void QuickSort(LinkList Head,LinkList Tail); //按照字符串排序
函数的实现部分:
#include"addressbook.h"
LinkList LinkInit() //初始化
{
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
if(NULL==L)
printf("申请空间失败!\n");
L->next=NULL;
return L;
}
void Add(LinkList L,int n) //添加联系人
{
int i = 0;
for(i = 0;i < n;i++)
{
LinkList p;
p = (LinkList)malloc(sizeof(LNode));
printf("请输入第%d个联系人信息:\n",i+1);
printf("name:");
scanf("%s",&p->name);
printf("tel:");
scanf("%s",&p->tel);
printf("address:");
scanf("%s",&p->ad);
printf("sex:");
scanf("%s",&p->sex);
printf("age:");
scanf("%d",&p->age);
p->next = L->next;
L->next = p;
}
}
void Show(LinkList L) //显示所有联系人
{
if(L->next == NULL)
printf("通讯录没有联系人!\n");
else
{
LinkList p = L->next;
while(p)
{
printf("name:%s\t",p->name);
printf("age:%d\t",p->age);
printf("sex:%c\t",p->sex);
printf("tel:%s\t",p->tel);
printf("address:%s\t",p->ad);
printf("\n");
p = p->next;
}
}
}
void Delete(LinkList L) //删除联系人
{
LinkList p = L;
char temp[20] = {0};
printf("请输入要删除的联系人:\n");
scanf("%s",&temp);
while(p->next)
{
if(strcmp(temp,p->next->name) == 0)
{
LinkList q = p->next;
p->next = q->next;
free(q);
printf("删除成功!\n");
break;
}
p = p->next;
}
if(NULL == p->next)
printf("找不到此联系人!\n");
}
void Search(LinkList L) //查找联系人
{
LinkList p = L->next;
char temp[20] = {0};
printf("请输入要查找的联系人:\n");
scanf("%s",&temp);
while(p)
{
if(strcmp(temp,p->name) == 0)
{
printf("name:%s\t",p->name);
printf("age:%d\t",p->age);
printf("sex:%c\t",p->sex);
printf("tel:%s\t",p->tel);
printf("address:%s\t",p->ad);
printf("\n");
break;
}
p = p->next;
}
if(NULL == p)
printf("找不到此联系人!\n");
}
void Modify(LinkList L) //修改联系人
{
LinkList p = L->next;
char temp[20] = {0};
printf("请输入要修改的联系人:\n");
scanf("%s",&temp);
while(p)
{
if(strcmp(temp,p->name) == 0)
{
printf("name:%s\t",p->name);
printf("age:%d\t",p->age);
printf("sex:%c\t",p->sex);
printf("tel:%s\t",p->tel);
printf("address:%s\t",p->ad);
printf("\n");
printf("请重新输入信息!\n");
printf("name:");
scanf("%s",&p->name);
printf("tel:");
scanf("%s",&p->tel);
printf("address:");
scanf("%s",&p->ad);
printf("sex:");
scanf("%s",&p->sex);
printf("age:");
scanf("%d",&p->age);
printf("修改成功!\n");
break;
}
p = p->next;
}
if(NULL == p)
printf("找不到此联系人!\n");
}
void ClearAll(LinkList L)
{
LinkList p = L->next;
LinkList q = L->next;
while(p->next)
{
q = q->next;
free(p);
p = q;
}
L->next = NULL;
}
void QuickSort(LinkList Head,LinkList Tail)
{
if(Head->next!=Tail&&Head->next->next!=Tail)
{
LinkList KeyP=Head->next; //指向存key值内存单元的指针
LinkList LP=Head; //比key值小的游标指针,KeyP的左边
LinkList RP=KeyP; //比key值大的游标指针,KeyP的右边
LinkList IncP=KeyP->next; //遍历单链表的游标指针,每次移动一位
while(IncP!=Tail)
{
if(strcmp(IncP->name,KeyP->name)<0)
LP=LP->next=IncP;
else
RP=RP->next=IncP;
IncP=IncP->next;
}
LP->next=KeyP; //将小于Key值的子链表衔接
RP->next=Tail; //将大于Key值的子链表衔接
//递归
QuickSort(Head,KeyP); //比Key小的子链表排序
QuickSort(KeyP,Tail); //比Key大的子链表排序
//注Head和Tail是不参与排序的,只起表头和表尾标识作用,故原链表的Tail值为NULL
}
printf("排序成功!\n");
}
主函数部分:
#include"addressbook.h"
void menu()
{
printf("***************通讯录***************\n");
printf(" 1.添加联系人信息\n");
printf(" 2.删除联系人信息\n");
printf(" 3.修改联系人信息\n");
printf(" 4.显示所有联系人信息\n");
printf(" 5.查找联系人信息\n");
printf(" 6.清空所有联系人信息\n");
printf(" 7.按名字排序所有联系人\n");
printf(" 0.退出通讯录\n");
printf("************************************\n");
}
int main()
{
int n = 0;
int num = 0;
LinkList Link =LinkInit();
do
{
menu();
printf("请输入0到7\n");
scanf("%d",&n);
switch(n)
{
case 1:
{
printf("请输入要添加联系人的个数:");
scanf("%d",&num);
Add(Link,num);
}
break;
case 2:
Delete(Link);
break;
case 3:
Modify(Link);
break;
case 4:
Show(Link);
break;
case 5:
Search(Link);
break;
case 6:
ClearAll(Link);
break;
case 7:
QuickSort(Link,NULL);
break;
default:
break;
}
}while(n);
return 0;
}