您的位置:首页 > 其它

通讯录(链表实现,基本功能都有)

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;
}

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: