首页 > 学院 > 开发设计 > 正文

通讯录(链表、文件)

2019-11-14 09:14:04
字体:
来源:转载
供稿:网友
#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<string.h>#define len sizeof(struct Node)#define ERROR   1#define OK      0struct Node{char name[30];    int data;    struct Node *next;};typedef struct Node  LinkList; /* 定义LinkList *//* 初始化顺序线性表生成一个头返回head */LinkList * InitList() { LinkList *head;   head=(LinkList *)malloc(len);  /* 产生头结点,并使L指向此头结点 */   if(head==NULL)     /* 存储分配失败 */    PRintf("malloc is not good");   head->next=NULL;   /* 指针域为空 */   return head;}/*数据的输出打印*/void print(LinkList *head){LinkList *p;p=head->next;if(p==NULL)printf("this is empty/n");while(p!=NULL){printf("姓名: %-10s 号码: %-10d/n",p->name,p->data);p=p->next;}}/*  初始化后   数据添加   采用(头插法) */LinkList * CreateListHead(LinkList *head) {printf("*表示输入结束/n");LinkList *p;int i;//head = (LinkList *)malloc(len);//head->next = NULL;            /*  先建立一个带头结点的单链表 *///p=head->next;//////////////while(1){p = (LinkList *)malloc(len); /*  生成新结点 */printf("请输入姓名:/n");scanf("%s",p->name);if(strcmp(p->name,"*") == 0)break;printf("请输入号码:/n");scanf("%d",&p->data);p->next = head->next;    head->next = p;/*  插入到表头 */}return head;}/* 删除 *//* 操作结果:输入要删除的  元素     进行删除 */LinkList * ListDelete(LinkList *head) { LinkList *pre,*after,*p;p=(LinkList *)malloc(len);//插入时申请空间printf("请输入要删除姓名:/n");scanf("%s",p->name);pre = head;after=head->next;while(after != NULL){ if(strcmp(after->name,p->name)==0){ pre->next=after->next;free(after);break;}else{pre=after;after=after->next;//错误地点}}if(after == NULL)printf("this data is not exist/n");return head;}/* 插入 *//* 操作结果:把数据插在第 n 个位置 */LinkList * ListInsert(LinkList *head,int n){LinkList *new,*look;;new=(LinkList *)malloc(len);//插入时申请空间printf("添加  新联系人/n");printf("新加  姓名:/n");scanf("%s",new->name);printf("新加  号码:/n");scanf("%d",&new->data);int count=0;if(head==NULL){head=new;new->next=NULL;}else{if(n==0){new->next=head;head=new;}else{look=head;while((look!=NULL)&&(count<n-1)){look=look->next;count++;}if(count==n-1){new->next=look->next;look->next=new;}if(new==NULL)printf("out of the range,");}}return head;} /*   排序*//*  按照   名字    排序*/LinkList *ListSort(LinkList *head){LinkList *p1,*p2,*p,*s;int i,j,n=1;   s=head->next; /* s指向第一个结点 */   while(s)        /*数元素的个数,计数...........遍历得到n*/                    {         n++;        s=s->next;       }p=(LinkList *)malloc(len);for(i=0;i<(n-1);i++){ p1=head;p2=p1->next;for(j=0;j<(n-i-1);j++){if(strcmp(p1->name,p2->name)>0){p->data=p1->data;p1->data=p2->data;p2->data=p->data;strcpy(p->name,p1->name);strcpy(p1->name,p2->name);strcpy(p2->name,p->name);}p1=p2;p2=p2->next;}}return head;}/*     查找     通过名字,找到电话号码*/LinkList *xuzhao(LinkList *head){LinkList *p,*x;p=head;int count=0;x=(LinkList *)malloc(len);//申请空间printf("****输入要查找姓名****/n");scanf("%s",x->name);while(1){ if( strcmp(p->name,x->name)==0 ){printf("姓名%-10s 号码:%-10d/n",p->name,p->data);break;}p=p->next;if(p==NULL){ printf("*********查无此人*************/n");break;}}}LinkList * xiugai(LinkList *head){LinkList *p,*x,*q;p=head;int count=0;x=(LinkList *)malloc(len);printf("输入要修改姓名/n");scanf("%s",x->name);while(1){ if( strcmp(p->name,x->name)==0 ){break;}p=p->next; if(p == NULL){printf("这个名字不存在/n");return head;}}printf("修改为:姓名   号码/n");scanf("%s %d",p->name,&p->data);printf("姓名%-10s 号码:%-10d/n",p->name,p->data);return head;}/*桌面显示*/int beijing(){printf("********************************************/n");printf("**选择:1   创建通讯录                          /n");printf("**选择:2   查找联系人                        /n");printf("**选择:3   删除联系人                          /n");printf("**选择:4   添加联系人                         /n");printf("**选择:5   对联系人排序                      /n");printf("**选择:6   对联系人信息修改               /n");printf("**选择:0   退出编辑                           /n");printf("********************************************/n");}/*将数据进行保存*/void save(LinkList *head){LinkList *p;FILE *fp;p=head->next; fp=fopen("s2.txt","wt");if( fp == NULL){printf("fopen error");exit(-1);}while( p != NULL){fwrite(p,len,1,fp);p=p->next;}fclose(fp);}/*将文件数据写入入链表*/LinkList * out_liaobiao(LinkList *head){LinkList *tmp,*p;FILE * fp;  fp=fopen("s2.txt","rt");if(fp == NULL)    {        printf("fopen error/n");        exit(1);    }  tmp=(LinkList *)malloc(len);while( fread(tmp,len,1,fp))//fread 返回数据块的数目{tmp->next = head->next;    head->next = tmp;tmp=(LinkList *)malloc(len);}return head;fclose(fp);}/*将文件数据写入入链表*//*   也可以用另外一种方法*//*LinkList * out_liaobiao(LinkList *head){FILE * fp;LinkList *p;int i = 0;long llen;if( (fp=fopen("s2.txt","rt")) == NULL ){printf("fopen error/n");        exit(1);}fseek(fp,0,2);llen= ftell(fp);fseek(fp,0,0);while(llen != 0){p=(LinkList *)malloc(len);if( p == NULL)printf("tmp empty/n");fread(p,len,1,fp);p->next = head->next;    head->next = p;llen=llen-len;}if(llen==0)return head;fclose(fp);}*/int main(){LinkList *head;int num;head=InitList();head=out_liaobiao(head);print(head); while(1){ beijing();printf("请选择/n");scanf("%d",&num);switch(num){case 0: save(head);exit(0);case 1: head=CreateListHead(head); //f_write(head);//save(head);print(head);break; case 2: xuzhao(head);              break;case 3: head=ListDelete(head);print(head); break;case 4: head=ListInsert(head,1);print(head); break;case 5: head=ListSort(head);print(head); break;case 6: head=xiugai(head);print(head); break;/*case 7: head=InitList();print(head);break;case 8: head=out_liaobiao(head);print(head); break;*/default : printf("这是错误的,请重新选择/n"); break;}}}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表