通讯录(链表实现,基本功能都有)
2018-08-05 20:27
106 查看
1、头文件
[code]#ifndef _LIST_H_ #define _LIST_H_ #include <stdio.h> #define FAILURE 1000 #define SUCCESS 1001 #define FALSE 1002 #define TRUE 1003 struct node { char ID[10]; char name[10]; char tel[10]; struct node * next; }; typedef struct node Node; int link_init(Node **head);//初始化 int link_insert(Node **head,void (*p)(Node *));//尾插法 int link_delete(Node **head,char *ID);//删除 int link_display(Node *head,void (*p)(Node *));//遍历 int link_search(Node *head,char *ID,void (*p)(Node *));//搜索 int link_modify(Node *head,char *ID,void (*p)(Node *));//修改 void put_in(Node*); void print(Node *); #endif
2、链表功能函数
[code]#include <stdio.h> #include <stdlib.h> #include <string.h> #include "list.h"//要注意头文件的格式,并且要用""包含文件 void put_in(Node *newnode)//插入 { printf("请输入ID:\n"); scanf("%s",newnode->ID); printf("请输入name:\n"); scanf("%s",newnode->name); printf("请输入tel:\n"); scanf("%s",newnode->tel); } void print(Node * temp) { printf("\n-------------------------------\n"); printf("ID :%s ",temp->ID); printf("name:%s ",temp->name); printf("tel :%s ",temp->tel); printf("\n"); } int link_init(Node **head)//初始化 { *head = (Node *)malloc(sizeof(Node)); if(*head == NULL) { return FAILURE; } else { (*head)->next = NULL; return SUCCESS; } } int link_delete(Node **head,char *ID)//按ID删除 { if((*head)==NULL) { return FAILURE; } if((*head)->next == NULL) { return FAILURE; } Node* temp = *head; Node*p; while(temp->next!=NULL) { if(strcmp(temp->next->ID,ID) == 0) { p = temp->next;//标记 temp->next = temp->next->next; free(p); return SUCCESS; } temp = temp->next; } return FAILURE; } int link_display(Node *head,void (*p)(Node *))//遍历 { if(head->next == NULL) { printf("链表是空的,查看失败!\n"); return FAILURE; } else { Node *temp = head; temp = temp->next;//temp指向第一个结点 while(temp != NULL) { p(temp); temp = temp->next; } return SUCCESS; } } int link_insert(Node **head,void p(Node *))//尾插法 {//通过调用函数输入数据 if((*head) == NULL) { return FAILURE; } Node *newnode=(Node *)malloc(sizeof(Node)); if(newnode == NULL) { return FAILURE; } Node* temp = *head; while(temp->next != NULL) { temp = temp->next; } temp->next = newnode; newnode->next = NULL; p(newnode); return SUCCESS; } int link_search(Node *head,char *ID,void p(Node *)) {//通过函数打印数据 if(head->next == NULL) { //printf("链表为空,无法查找!\n"); return FAILURE; } else { Node * temp = head->next; while(temp!= NULL) { if(strcmp(temp->ID,ID) == 0) { p(temp);//打印 return SUCCESS; } temp = temp->next; } if(temp == NULL) { return FAILURE; } } } int link_modify(Node *head,char *ID,void (*p)(Node*))//调用print函数 { if(head==NULL||head->next==NULL) { return FAILURE; } else { Node *temp = head->next;//指向第一个结点 while(temp!=NULL) { if(strcmp(temp->ID,ID)==0) { // printf("请输入修改后的信息:\n"); p(temp); return SUCCESS; } temp = temp->next; } return FAILURE; } }
3、main函数及其他子函数
[code]#include <stdio.h> #include <string.h> #include <stdlib.h> #include "list.h" enum HUANSHU //枚举类型,避免case语句中出现幻数,从第一个值依次累加 { QUIT=0, ADD, DISPLAY,//逗号 SEARCH, DELETE, MODIFY, }; void menu()//菜单 { printf(" --------------------------------------------\n"); printf(" -------------------\033[0;34m通讯录\033[0m-------------------\n"); printf("\n ************\033[1;34m1、添加联系人信息\033[0m****************\n\n"); printf("\n\n ************\033[1;34m2、查看所有联系人\033[0m****************\n\n"); printf("\n\n ************\033[1;34m3、搜索联系人信息\033[0m****************\n\n"); printf("\n\n ************\033[1;34m4、删除联系人信息\033[0m****************\n\n"); printf("\n\n ************\033[1;34m5、修改联系人信息\033[0m****************\n\n"); printf("\n\n ------------\033[1;34m0、退出\033[0m--------------------------\n"); printf(" ---------------------------------------------\n"); } void deal_A(int ret) { if(ret == SUCCESS) { printf("\033[0;34m[Insert Success]\033[0m\n"); printf("\033[0;34m提示:[q键+回车 退出][回车 继续输入]\033[0m\n"); getchar();//接回车键 } else if(ret == FAILURE) { printf("\033[0;31m[Insert Failure]\033[0m\n"); printf("\033[0;31m[请重新输入!]\033[0m\n"); } } void deal_M(int ret)//修改 { if(ret == SUCCESS) { printf("\033[0;34m[修改成功!]\033[0m\n"); } else if(ret == FAILURE) { printf("\033[0;31m[修改失败!]\033[0m\n"); printf("\033[0;31m[找不到该联系人!]\033[0m\n"); } printf("\033[0;34m[请按任意键继续...]\033[0m\n"); } void deal_S(int ret)//修改 { if(ret == SUCCESS) { printf("\033[0;34m[搜索成功!]\033[0m\n"); } else if(ret == FAILURE) { printf("\033[0;31m[搜索失败!]\033[0m\n"); printf("\033[0;31m[找不到该联系人!]\033[0m\n"); } printf("\033[0;34m[请按任意键继续...]\033[0m\n"); } void deal_D(int ret)//查看 { if(ret == SUCCESS) { printf("\033[0;34m[查看成功!]\033[0m\n"); } else if(ret == FAILURE) { printf("\033[0;31m[查看失败!]\033[0m\n"); printf("\033[0;31m[链表可能为空!]\033[0m\n"); } printf("\033[0;34m[请按任意键继续...]\033[0m\n"); } void deal_Del(int ret)//删除 { if(ret == SUCCESS) { printf("\033[0;34m[删除成功!]\033[0m\n"); } else if(ret == FAILURE) { printf("\033[0;31m[删除失败!]\033[0m\n"); printf("\033[0;31m[找不到该联系人!]\033[0m\n"); } printf("\033[0;34m[请按任意键继续...]\033[0m\n"); } int main() { Node *head; int choice; int ret; char ch; link_init(&head); while(1) { ret = 0; menu(); printf("\n请输入0到5进行选择:\n"); scanf("%d",&choice); printf("choice = %d\n",choice); switch(choice) { case ADD: { system("clear"); while(1)//循环插入 { deal_A(link_insert(&head,put_in)); if((ch = getchar()) == 'q')//用if语句判断,跳出外层while循环,退回主函数 { break; } ret = 0;//归位 } break; } case DISPLAY: { system("clear"); deal_D(link_display(head,print)); getchar(); getchar(); break; } case SEARCH: { char ID[20]; system("clear"); printf("\033[0;31m请输入你要搜索的联系人ID:\033[0m\n"); scanf("%s",ID); deal_S(link_search(head,ID,print));//需要另外的参数 getchar(); getchar(); break; } case DELETE: { char ID[20]; system("clear"); printf("\033[0;31m请输入你要删除的联系人ID:\033[0m\n"); scanf("%s",ID); deal_Del(link_delete(&head,ID));//需要另外一个参数 getchar(); getchar(); break; } case MODIFY: { char ID[20]; system("clear"); printf("\033[0;31m请输入你要修改信息的联系人的ID:\033[0m\n"); scanf("%s",ID); deal_M(link_modify(head,ID,put_in)); getchar(); getchar(); break; } case QUIT: { exit(1); break; } } } return 0; }
阅读更多
相关文章推荐
- HashMap存取效率高原因、ArrayList和LinkedList区别、JAVA实现链表的基本功能
- 用链表实现带菜单功能的一元多项式的基本操作 (Use linked list to realize the basic operation of a one-dimensional polynom)
- 实现单向链表的基本功能
- 链表实现功能强大的通讯录
- 用C实现基本链表功能
- 利用 双向循环链表 实现通讯录的功能
- C++实现双链表的基本功能
- c语言单向链表的基本功能的实现
- 通讯录(用链表功能实现)
- 运用链表实现简易通讯录功能
- 单链表的基本功能 与扩展功能的实现
- 【C++/STL】list的实现(没有采用迭代器和空间配置器所实现的双向链表的基本功能)
- Java实现单向链表基本功能
- Java实现单向链表的基本功能详解
- 链表的建立和一些基本功能的实现
- 链表的基本功能实现
- 链表队列基本功能的实现
- 基于链表实现一个简单通讯录功能
- 数据结构--单链表基本功能实现程序…