- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<unistd.h>
- #include<fcntl.h>
- #define N 15
- #define FALSE 0
- #define TURE 1
- typedef char Elemtype;
- typedef int Number;
- typedef int Status;
- typedef struct Node
- {
- Number data;
- Elemtype nam[N];
- Elemtype num[N];
- struct Node *next;
- }Node,*Linklist;
- Status Iinklist(Linklist *L) //初始化
- {
- Node *p=(Node *)malloc(sizeof(Node)); //申请一个头结点
- if(p==NULL)
- {
- printf(" 初始化失败!\n");
- return FALSE;
- }
- *L=p;
- (*L)->data=0;
- int i;
- for(i=0;i<N;i++)
- {
- (*L)->nam[i]=0;
- (*L)->num[i]=0;
- }
- (*L)->next=NULL;
- return TURE;
- }
- Status Insert(Linklist *L,Elemtype name[N],Elemtype number[N]) //新建联系人
- {
- Node *p=(Node *)malloc(sizeof(Node)); //新申请的结构体
- Linklist tmp=*L; //如果用*L对p不断赋值,头结点就找不到了
- if(p==NULL)
- {
- printf(" 通信录空间已满!\n");
- return FALSE;
- }
- (*L)->data++;
- strcpy(p->nam, name);
- strcpy(p->num, number);
- p->next=tmp->next;
- tmp->next=p;
- return TURE;
- }
- Status Delete(Linklist *L,Elemtype name[N]) //删除联系人
- {
- Linklist tmp=(*L);
- Linklist tmp2;
- int i=0;
- if((*L)->next==NULL)
- {
- printf(" 通讯录为空!\n");
- return FALSE;
- }
- while(i<(*L)->data&&tmp->next!=NULL)
- {
- i++;
- if(strcmp(tmp->next->nam,name)==0)
- {
- tmp2=tmp->next;
- name=tmp2->nam;
- tmp->next=tmp2->next;
- free(tmp2);
- (*L)->data--;
- return TURE;
- }
- tmp=tmp->next;
- }
- printf(" 输入联系人姓名有误!\n");
- return FALSE;
- }
- Status Get(Linklist *L,Elemtype name[N]) //查找联系人
- {
- Linklist tmp=*L;
- if(((*L)->data)==0)
- {
- printf("通讯录为空\n");
- return FALSE;
- }
- printf(" 通讯录中共有%d个联系人.\n",(*L)->data);
- printf(" 请输入要查找的联系人的姓名:");
- scanf("%s",name);
- tmp=tmp->next;
- while(tmp!=NULL)
- {
- if(strcmp(tmp->nam,name)==0)
- {
- printf(" 要查找的联系人的电话号码为: %s",tmp->num);
- return TURE;
- }
- tmp=tmp->next;
- }
- printf(" 查无此人!\n");
- return FALSE;
- }
- Status Print(Linklist *L) //查看全部通讯录
- {
- if((*L)->data==0)
- {
- printf(" 通讯录为空!\n");
- return FALSE;
- }
- Linklist tmp=*L;
- tmp=tmp->next;
- while(tmp!=NULL)
- {
- printf(" 姓名:%s",tmp->nam);
- printf(" 电话:%s\n",tmp->num);
- tmp=tmp->next;
- }
- return TURE;
- }
- Status Rank(Linklist *L) //按首字母排序
- {
- Linklist tmp=(*L)->next;
- if((*L)==NULL)
- {
- printf(" 通讯录为空!\n");
- return FALSE;
- }
- int i=0,j;
- Linklist a[50];
- int flag=FALSE;
- while(tmp!=NULL)
- {
- a[i]=tmp;
- tmp=tmp->next;
- i++;
- }
- for(i=0;i<((*L)->data)-1;i++)
- {
- flag=TURE;
- for(j=0;j<(((*L)->data)-1-i);j++)
- {
- if(strcmp(a[j]->nam,a[j+1]->nam)>0)
- {
- Linklist tmp2;
- tmp2=a[j];
- a[j]=a[j+1];
- a[j+1]=tmp2;
- }
- flag=FALSE;
- }
- }
- for(i=0;i<(*L)->data;i++)
- {
- printf(" 姓名:%s",a[i]->nam);
- printf(" 电话:%s\n",a[i]->num);
- }
- }
- Status Mod(Linklist *L,Elemtype name[N],Elemtype number [N]) //修改联系人信息
- {
- printf(" 请输入要修改的联系人姓名: ");
- scanf("%s",name);
- Linklist tmp=*L;
- tmp=tmp->next;
- while(tmp!=NULL)
- {
- if(strcmp(tmp->nam,name)==0)
- {
- printf(" 请输入新的联系人号码: ");
- scanf("%s",number);
- strcpy(tmp->num,number);
- printf(" 修改成功!\n");
- return TURE;
- }
- tmp=tmp->next;
- }
- printf(" 查无此人!\n");
- return FALSE;
- }
- Status Preserve(Linklist L) //保存联系人信息
- {
- int fd=open("phone.txt",O_RDWR);
- Linklist tmp=L;
- if(fd==-1)
- {
- perror("open");
- return 1;
- }
- int cal;
- tmp=tmp->next;
- while(tmp!=NULL)
- {
- cal=write(fd,tmp,sizeof(Node));
- tmp=tmp->next;
- }
- close(fd);
- return 2;
- }
- int main()
- {
- Linklist Ltop;
- Iinklist(&Ltop);
- Node a;
- int cal2=Iinklist(&Ltop);
- Elemtype name[N];
- Elemtype number[N];
- int fd2=open("phone.txt",O_CREAT|O_RDWR,0777);
- if(fd2==-1)
- {
- perror("open");
- return 1;
- }
- while(read(fd2,&a,sizeof(Node))!=0)
- {
- Insert(&Ltop,a.nam,a.num);
- }
- close(fd2);
- printf("\t已存联系人信息\n");
- printf(" ******************\n");
- Print(&Ltop);
- printf(" ******************\n");
- while(1)
- {
- printf("\t\t\t1.新建联系人\n");
- printf("\t\t\t2.删除联系人\n");
- printf("\t\t\t3.查找联系人\n");
- printf("\t\t\t4.查看全部通讯录\n");
- printf("\t\t\t5.按首字母排序\n");
- printf("\t\t\t6.修改联系人号码\n");
- printf("\t\t\t0.保存并退出程序\n");
- int i;
- scanf("%d",&i);
- switch(i)
- {
- case 1:
- printf(" 请输入新建联系人的姓名:");
- scanf("%s",name);
- printf(" 请输入新建联系人电话号码: ");
- scanf("%s",number);
- Insert(&Ltop,name,number);
- break;
- case 2:
- printf(" 请输入要删除的联系人姓名:");
- scanf("%s",name);
- if(Delete(&Ltop,name)==1)
- printf(" 已删除联系人!\n");
- break;
- case 3:
- Get(&Ltop,name);
- break;
- case 4:
- Print(&Ltop);
- break;
- case 5:
- Rank(&Ltop);
- break;
- case 6:
- Mod(&Ltop,name,number);
- break;
- case 0:
- Preserve(Ltop);
- return 0;
- break;
- default:
- printf(" 输入选项有误!\n");
- return FALSE;
- break;
- }
- }
- return 0;
- }
基于Linux的通讯录设计(链表实现)
最新推荐文章于 2021-07-29 18:23:04 发布