通讯录程序(修改过后)
1 /****************************/ 2 /*主控菜单处理测试程序main.c*/ 3 /****************************/ 4 #include<stdio.h> 5 #include<string.h> 6 #include<malloc.h> 7 #include<stdlib.h> 8 typedef struct{ //通讯录结点类型 9 char num[5]; //编号 10 char name[9]; //姓名 11 char sex[3]; //性别 12 char phone[13]; //电话 13 char addr[31]; //地址 14 }DataType; 15 16 typedef struct node{ //结点类型 17 DataType data; //结点数据域 18 struct node *next; //结点指针域 19 }ListNode; 20 21 typedef ListNode *LinkList; 22 LinkList head; 23 ListNode *p; 24 //函数说明 25 26 int menu_select(); 27 LinkList CreateList(void); 28 void InsertNode(LinkList head,ListNode *p); 29 ListNode *ListFind(LinkList head); 30 void DelNode(LinkList head); 31 void PrintList(LinkList head); 32 //主函数 33 void main () 34 { 35 for (;;){ 36 switch(menu_select()) 37 { 38 case 1: 39 printf("**************************************\n"); 40 printf("* 通 讯 录 链 表 的 建 立 *\n"); 41 printf("**************************************\n"); 42 head=CreateList(); 43 break; 44 case 2: 45 printf("**************************************\n"); 46 printf("* 通 讯 者 信 息 的 添 加 *\n"); 47 printf("**************************************\n"); 48 printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)\n"); 49 printf("**************************************\n"); 50 p=(ListNode *)malloc(sizeof(ListNode)); //申请新结点 51 scanf("%s%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr); 52 InsertNode(head,p); 53 break; 54 case 3: 55 printf("***************************************\n"); 56 printf("* 通 讯 录 信 息 的 查 询 *\n"); 57 printf("***************************************\n"); 58 p=ListFind(head); 59 if(p!=NULL){ 60 printf("编 号 姓 名 性 别 联系电话 地 址\n"); 61 printf("***************************************\n"); 62 printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr); 63 printf("------------------------------------------"); 64 } 65 else 66 printf("没查到要查询的通讯者"); 67 break; 68 case 4: 69 printf("***************************************\n"); 70 printf("* 通 讯 录 信 息 的 删 除 *\n"); 71 printf("***************************************\n"); 72 DelNode(head); //删除结点 73 break; 74 case 5: 75 printf("***************************************\n"); 76 printf("* 通 讯 录 链 表 的 输 出 *\n"); 77 printf("***************************************\n"); 78 PrintList(head); 79 break; 80 case 0: 81 printf("\t 再见!\n"); 82 return; 83 } 84 } 85 } 86 87 /*************************/ 88 /* 菜单选择函数程序*/ 89 /*************************/ 90 int menu_select() 91 { 92 int sn; 93 printf(" 通讯录管理系统 \n"); 94 printf("=====================\n"); 95 printf(" 1.通讯录链表的建立\n"); 96 printf(" 2.通讯录链表的插入\n"); 97 printf(" 3.通讯录链表的查询\n"); 98 printf(" 4.通讯录链表的删除\n"); 99 printf(" 5.通讯录链表的输出\n"); 100 printf(" 0.退出管理系统 \n"); 101 printf("=====================\n"); 102 printf(" 请 选 择 0-5: "); 103 for(;;) 104 {scanf("%d",&sn); 105 if(sn<0||sn>5) 106 printf("\n\t输入错误,重选0-5: "); 107 else 108 break; 109 } 110 return sn; 111 } 112 113 /**********************************/ 114 /*用尾插法建立的通讯录链表函数*/ 115 /********************************/ 116 117 118 LinkList CreateList(void) 119 { //尾插法建立带头结点的通讯录链表算法 120 LinkList head=(ListNode *)malloc(sizeof(ListNode)); //申请头结点 121 ListNode *p,*rear; 122 int flag=0; //结束标志置0 123 rear=head; //尾指针初始指向头结点 124 while(flag==0) 125 {p=(ListNode *)malloc(sizeof(ListNode)); //申请新结点 126 printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)\n"); 127 printf("----------------------------------\n"); 128 scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr); 129 rear->next=p; //新结点连接到尾结点之后 130 rear=p; //尾指针指向新结点 131 printf("结束建表吗?(1/0):"); 132 scanf("%d",&flag); //读入一个标志数据 133 } 134 rear->next=NULL; //终端结点指针域置空 135 return head; //返回链表头指针 136 } 137 138 /*******************************/ 139 /*在通讯录链表head中插入结点*/ 140 /*******************************/ 141 142 void InsertNode(LinkList head,ListNode *p) 143 {ListNode *p1,*p2; 144 p1=head; 145 p2=p1->next; 146 while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0) 147 {p1=p2; //p1指向刚访问过的结点 148 p2=p2->next; //p2指向表的下一个结点 149 } 150 p1->next=p; //插入p所指向的结点 151 p->next=p2; //连接表中剩余部分 152 } 153 154 155 /************************************/ 156 /* 有序通讯录链表上的查找*/ 157 /*********************************/ 158 159 ListNode *ListFind(LinkList head) 160 { //有序通讯录链表上的查找 161 ListNode *p; 162 char num[5]; 163 char name[9]; 164 int xz; 165 printf("=====================\n"); 166 printf(" 1.按编号查询 \n"); 167 printf(" 2.按姓名查询 \n"); 168 printf("=====================\n"); 169 printf(" 请选择: "); 170 p=head->next; //假定通讯录表带头结点 171 scanf("%d",&xz); 172 if(xz==1){ 173 printf("请输入要查找者的编号: "); 174 scanf("%s",&num); 175 getchar(); 176 while(p&&strcmp(p->data.num,num)<0) 177 p=p->next; 178 if(p==NULL||strcmp(p->data.num,num)>0) 179 p=NULL; 180 } 181 else if(xz==2) 182 { printf("请输入要查找者的姓名: "); 183 scanf("%s",&name); 184 while(p&&strcmp(p->data.name,name)!=0) 185 p=p->next; 186 } 187 return p; 188 } 189 190 191 192 193 194 void DelNode(LinkList head) 195 {char jx; 196 ListNode *p,*q; 197 p=ListFind(head); 198 if(p==NULL) 199 {printf("没有查到要查询的通讯者 !\n"); 200 return; 201 } 202 printf("真的要删除该结点吗?: "); 203 scanf("%c",&jx); 204 if(jx=='y'||jx=='Y') 205 {q=head; 206 while(q!=NULL&&q->next!=p) 207 q=q->next; 208 if(q!=NULL) 209 q->next=p->next; 210 free(p); 211 printf("通讯者已被删除!\n"); 212 } 213 } 214 215 216 217 218 219 void PrintList(LinkList head) 220 {p=head->next; 221 printf("编 号 姓 名 性 别 联系电话 地 址\n"); 222 printf("---------------------------------------------------\n"); 223 while(p!=NULL) 224 { printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr); 225 printf("---------------------------------------------------\n"); 226 p=p->next; 227 } 228 }