这是简单的单链表通讯录。
已经完成了基本操作:增、删、改、查、以及遍历通讯录名单。如果想要扩大通讯录的存储空间,更改头文件的"SIZE"的大小即可。
头文件:
#ifndef _addresslist_h
#define _addresslish_h
#define SUCCESS 1234
#define FAILURE 2345
#define SIZE 2
struct addresslist
{
int num;
char name[30];
char sex[10];
char tel[15];
char address[30];
struct addresslist *next;
};
typedef struct addresslist list;
int addresslistInit(list **l);
int print();
void menu();
int addinfo(list *l,int n);
int display(list *l);
int listdelete(list *l,int p,int *s_num,char *s_nam,char *s_sex,char *s_tel,char *s_add);
int listrevise(list *l);
int listfind(list *l);
#endif
自定义函数:
#include<stdio.h>
#include"addresslist.h"
#include<stdlib.h>
#include<string.h>
void menu()
{
//system("clear");
printf("\n\n\n***************************\n");
printf("1.显示通讯录 2.增加联系人 \n");
printf("3.删除联系人 4.修改联系人 \n");
printf("5.查找联系人 6.退出 \n");
}
int addresslistInit(list **l)
{
*l = (list*)malloc(sizeof(list)*1);
if( NULL == *l)
{
return FAILURE;
}
(*l)->next = NULL;
return SUCCESS;
}
int addinfo(list *l,int n)
{
list *p = l,*q;
q = (list*)malloc(sizeof(list)*1);
int k = 1;
if( NULL == l)
{
return FAILURE;
}
while ( k < n && p != NULL)
{
p = p->next;
k++;
}
if( k > n && NULL == p)
{
return FAILURE;
}
printf("plz input number:\n");
int a;
scanf("%d",&a);
q ->num = a;
printf("plz input name:\n");
char name[30]={0};
scanf("%s",name);
if( strcmp( name, "bye" ) == 0)
{
return SUCCESS;
}
else
{
strcpy( q->name , name);
}
printf("plz input sex:\n");
char sex[10]={0};
scanf("%s",sex);
strcpy(q->sex , sex);
printf("plz input tel:\n");
char tel[15]={0};
scanf("%s",tel);
strcpy(q->tel , tel);
printf("plz input address:\n");
char address[30]={0};
scanf("%s",address);
strcpy(q->address , address);
q ->next = p->next;
p ->next = q;
return SUCCESS;
}
int display(list *l)
{
if( NULL == l)
{
return FAILURE;
}
int s_sort;
printf("请选择:\n按序号输出:1\n按姓名首字母输出:2\n");
scanf("%d",&s_sort);
list* q = l;
if( 1 == s_sort )
{
while( q->next )
{
q = q->next;
printf("序号:%d\n",q->num);
printf("姓名:%s\n",q->name);
printf("性别:%s\n",q->sex);
printf("电话:%s\n",q->tel);
printf("地址:%s\n",q->address);
printf("\n");
}
printf("\n");
return SUCCESS;
}
else if ( 2 == s_sort )
{
list *p = l;
list *new_q = l;
char sort_tmp[30] = {0};
for( q = l; q != NULL ; q = q->next )
{
for( p = q->next; p != NULL ; p = p->next)
{
if( strncmp (q ->name,p ->name,10) > 0)
{
strcpy(sort_tmp , p ->name);
strcpy(p ->name , q ->name);
strcpy(q ->name , sort_tmp);
}
}
}
while( new_q->next )
{
new_q = new_q->next;
printf("序号:%d\n",new_q->num);
printf("姓名:%s\n",new_q->name);
printf("性别:%s\n",new_q->sex);
printf("电话:%s\n",new_q->tel);
printf("地址:%s\n",new_q->address);
printf("\n");
}
printf("\n");
return SUCCESS;
}
}
int listdelete(list *l,int p,int *s_num,char *s_nam,char *s_sex,char *s_tel,char *s_add)
{
int a;
if( NULL == l)
{
return FAILURE;
}
int k = 1;
list* q = l;
list* n;//用于先保存要删除的指针地址
while ( k < p )
{
q = q->next;
k++;
}
//循环结束时, k必然等于n
if( k > p || NULL == q)
{
return FAILURE;
}
n = q -> next; //先把 要被删除的地址存入n
*s_num = n->num;
s_nam = n->name;
s_sex = n->sex;
s_tel = n->tel;
s_add = n->address;
q ->next = n -> next; //将指针指向下下个地址
free ( n ) ; //释放掉被删除原先的地址
return SUCCESS;
}
int listrevise(list *l)
{
if( NULL == l)
{
return FAILURE;
}
list *p = l;
int i = 1,n;
printf("请输入想要被修改的序号:\n");
scanf("%d",&n);
while( i < n+1 )
{
p = p ->next;
i++;
}
if( NULL == p)
{
return FAILURE;
}
else
{
printf("姓名:\n");
scanf("%s",p ->name);
printf("性别:\n");
scanf("%s",p ->sex);
printf("电话:\n");
scanf("%s",p ->tel);
printf("地址:\n");
scanf("%s",p ->address);
}
return SUCCESS;
}
int listfind(list *l)
{
if( NULL == l )
{
return FAILURE;
}
printf("按姓名查找: 1\n按电话查找: 2\n按地址查找: 3\n");
char s_tmp[30] = {0};
list* q = l;
int location = 0;
int s_searchnumber;
scanf("%d",&s_searchnumber);
if( 1 == s_searchnumber )
{
printf("请输入一个姓名:\n");
scanf("%s",s_tmp);
while( q )
{
q = q->next;
location++;
if ( strcmp(q->name,s_tmp) == 0 )
{
return location;
}
}
return FAILURE;
}
if( 2 == s_searchnumber )
{
printf("请输入一个电话:\n");
scanf("%s",s_tmp);
while( q )
{
q = q->next;
location++;
if ( strcmp(q->tel,s_tmp) == 0 )
{
return location;
}
}
return FAILURE;
}
if( 3 == s_searchnumber)
{
printf("请输入一个地址:\n");
scanf("%s",s_tmp);
while( q )
{
q = q->next;
location++;
if ( strcmp(q->address,s_tmp) == 0 )
{
return location;
}
}
return FAILURE;
}
}
主函数:
#include<stdio.h>
#include"addresslist.h"
#include<stdlib.h>
/*
void print()
{
list *q = head;
printf("序号:%d\n",q->num);
printf("姓名:%s\n",q->name);
printf("性别:%s\n",q->sex);
printf("电话:%s\n",q->tel);
printf("地址:%s\n",q->address);
printf("\n");
}
*/
void welcome()
{
system("clear");
printf("\n\n\n******************************\n");
printf("********欢迎打开通讯录*******\n");
printf("******************************\n");
sleep(2);
}
int main()
{
list *head = NULL;
int c,ret,i;
int y = 2;
int d_p;
int s_num;
char s_nam[30] = {0};
char s_sex[10]={0};
char s_tel[15]={0};
char s_add[30]={0};
ret = addresslistInit(&head);
if( ret == SUCCESS)
{
printf("Init success!\n");
}
else if( FAILURE == ret)
{
printf("Init failure!\n");
}
welcome();
while (1)
{
menu();
scanf("%d",&c);
switch(c)
{
case 1:ret = display(head);
if( FAILURE == ret )
{
printf("display failure!\n");
}
if( SUCCESS == ret )
{
printf("display success!\n");
}
break;
case 2:
for( i = 0; i < SIZE ; i++)
{
ret = addinfo(head,i+1);
if( FAILURE == ret)
{
printf("insrt failure!\n");
}
if( SUCCESS == ret )
{
printf("insrt success!\n");
}
}
break;
case 3: printf("请输入要删除的序号:\n");
scanf("%d",&d_p);
ret = listdelete(head,d_p,&s_num,s_nam,s_sex,s_tel,s_add);
if( FAILURE == ret)
{
printf("detele failure!\n");
}
else
{
printf("detele success!\n");
}
break;
case 4: ret = listrevise(head);
if( SUCCESS == ret )
{
printf("revise success!\n");
}
if( FAILURE == ret )
{
printf("revise failure!\n");
}
break;
case 5: ret = listfind(head);
if( FAILURE == ret )
{
printf("not existed!\n");
}
else
{
printf("have been found!\n而且他的序号是 %d\n",ret);
}
break;
case 6:
exit(0);
}
}
return 0;
}