通讯录(链表、文件)

    xiaoxiao2021-03-26  36

    #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      0 struct 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; } } }
    转载请注明原文地址: https://ju.6miu.com/read-662172.html

    最新回复(0)