数据结构第四天
一、对通讯录添加功能
1、遇到重名的信息,可以根据id删除
2、添加退出功能。
3、输入id时提供id是否重复的功能
以下为改进的代码
#include <stdio.h>
#include "Linklist.h"
#include <stdlib.h>
#include <string.h>
enum {ADD = 1,INFORMATION,FIND,DELETE}; //功能选项
enum {BACK,ID,PHONE,CONPANY,NAME}; //添加选项
void Menu(); //主菜单
void Menu_add(); //添加信息菜单
void Menu_search(); //查找菜单
void Menu_delete(); //删除菜单
void Func(List *ls,int k); //功能选择
void Add(List *ls); //添加信息
void Search(List *ls,int i); //查找信息
void Delete(List *ls,int i); //删除信息
BOOL array(List *ls); //排列信息
int main()
{
List *ls = Creat(); //创建链表
while(1)
{
system("clear");
Menu();
int k; //功能选项
scanf("%d",&k);
Func(ls,k);
}
return 0;
}
//菜单模块
void Menu()
{
printf("---------------------------------------------------\n");
printf("\t\t1、添加好友信息\n");
printf("\t\t2、全部好友信息\n");
printf("\t\t3、搜索好友\n");
printf("\t\t4、删除好友\n");
printf("----------------------------------------------------\n");
}
void Menu_add()
{
printf("*****************************************************\n");
printf("\t\t1、添加ID号\n");
printf("\t\t2、添加手机号码\n");
printf("\t\t3、添加公司电话\n");
printf("\t\t4、添加姓名\n");
printf("\t\t0、请按0返回上一个菜单\n");
printf("****************************************************\n");
}
void Menu_search()
{
printf("****************************************************\n");
printf("\t\t1、根据ID号查找\n");
printf("\t\t2、根据手机号码查找\n");
printf("\t\t3、根据公司电话查找\n");
printf("\t\t4、根据姓名查找\n");
printf("\t\t0、请按0返回上一个菜单\n");
printf("***************************************************\n");
}
void Menu_delete()
{
printf("**************************************************\n");
printf("\t\t1、根据ID号删除\n");
printf("\t\t2、根据手机号码删除\n");
printf("\t\t3、根据公司电话删除\n");
printf("\t\t4、根据姓名删除\n");
printf("\t\t0、请按0返回上一个菜单\n");
printf("**************************************************\n");
}
//功能选择模块
void Func(List *ls,int k)
{
int j = 1; //用于退出显示部分
switch(k)
{
case ADD:
system("clear");
Menu_add();
Add(ls);
break;
case INFORMATION:
system("clear");
if(NULL == ls->head->next)
printf("拒绝肥宅,广交好友!!!\n");
else
Display(ls);
while(1)
{
printf("请按0退出\n");
scanf("%d",&j);
if(0 == j)
break;
}
break;
case FIND:
system("clear");
Menu_search();
int i;
scanf("%d",&i);
Search(ls,i);
break;
case DELETE:
system("clear");
Menu_delete();
int n;
scanf("%d",&n);
Delete(ls,n);
break;
default:
printf("无效的选项\n");
sleep(2);
break;
}
}
//添加模块
void Add(List *ls)
{
Node *pb = (Node *)malloc(sizeof(Node)/sizeof(char));
system("clear");
printf("请输入ID\n");
scanf("%d",&(pb->id));
Node *tmp = ls->head;
while(tmp->next) //防止id重复
{
if(tmp->next->id == pb->id)
{
printf("重复id,请重新输入\n");
sleep(1);
return;
}
break;
}
system("clear");
printf("请输入phone\n");
scanf("%ld",&(pb->phone));
system("clear");
printf("请输入company\n");
scanf("%ld",&(pb->company));
system("clear");
printf("请输入name\n");
scanf("%s",pb->name);
inster_last(ls,pb);
}
//查找模块
void Search(List *ls,int i)
{
Node *pb = (Node *)malloc(sizeof(Node)/sizeof(char));
Node *tmp = ls->head;
int j; //用于退出显示部分
switch(i)
{
case ID: //通过id查找
system("clear");
printf("请根据id查找\n");
scanf("%d",&(pb->id));
while(tmp->next)
{
tmp = tmp->next;
if(pb->id == tmp->id)
{
printf("id:%d\t",tmp->id);
printf("phone:%ld\t",tmp->phone);
printf("company%ld\n",tmp->company);
}
}
while(1) //退出显示
{
printf("请按0退出\n");
scanf("%d",&j);
if(0 == j)
return;
}
printf("没有此信息\n"); //无信息反馈
sleep(2);
break;
case PHONE: //通过电话找
system("clear");
printf("请根据phone查找\n");
scanf("%ld",&(pb->phone));
while(tmp->next)
{
tmp = tmp->next;
if(pb->phone == tmp->phone)
{
printf("id:%d\t",tmp->id);
printf("phone:%ld\t",tmp->phone);
printf("company%ld\n",tmp->company);
}
}
while(1) //退出显示
{
printf("请按0退出\n");
scanf("%d",&j);
if(0 == j)
return;
}
printf("没有此信息\n"); //无信息反馈
sleep(2);
break;
case CONPANY: //通过公司电话找
system("clear");
printf("请根据company查找\n");
scanf("%ld",&(pb->company));
while(tmp->next)
{
tmp = tmp->next;
if(pb->company == tmp->company)
{
printf("id:%d\t",tmp->id);
printf("phone:%ld\t",tmp->phone);
printf("company%ld\n",tmp->company);
}
}
while(1) //退出显示
{
printf("请按0退出\n");
scanf("%d",&j);
if(0 == j)
return;
}
printf("没有此信息\n"); //无信息反馈
sleep(2);
break;
case NAME: //通过名字找
system("clear");
printf("请根据name查找\n");
scanf("%s",pb->name);
while(tmp->next)
{
tmp = tmp->next;
if(0 == strcmp(pb->name,tmp->name))
{
printf("id:%d\t",tmp->id);
printf("phone:%ld\t",tmp->phone);
printf("company%ld\n",tmp->company);
}
}
while(1) //退出显示
{
printf("请按0退出\n");
scanf("%d",&j);
if(0 == j)
return;
}
printf("没有此信息\n"); //无信息反馈
sleep(2);
break;
case BACK:
printf("请按0返回上一个菜单\n");
break;
default: //无效指令
printf("无效指令\n");
sleep(2);
break;
}
}
//删除模块
void Delete(List *ls,int i)
{
int count = 0; //用于判断是否成功删除,以及是否有重名的人
Node *pb = (Node *)malloc(sizeof(Node)/sizeof(char));
switch(i)
{
case ID:
system("clear");
printf("请根据id删除\n");
scanf("%d",&(pb->id));
count = delete_pos(ls,pb);
if(count == 1)
{
printf("删除id为%d的数据成功\n",pb->id);
sleep(1);
}
else
{
printf("删除失败,无此id\n");
sleep(1);
}
break;
case PHONE:
system("clear");
printf("请根据phone查找\n");
scanf("%ld",&(pb->phone));
count = delete_pos(ls,pb);
if(count == 1)
{
printf("删除电话为%ld的数据成功\n",pb->phone);
sleep(1);
}
else
{
printf("删除失败,无此电话\n");
sleep(1);
}
break;
case CONPANY:
system("clear");
printf("请根据conpany删除\n");
scanf("%ld",&(pb->company));
count = delete_pos(ls,pb);
if(count == 1)
{
printf("删除公司电话为%ld的数据成功\n",pb->company);
sleep(1);
}
else
{
printf("删除失败,无此公司电话\n");
sleep(1);
}
break;
case NAME:
system("clear");
printf("请根据name删除\n");
scanf("%s",pb->name);
count = delete_pos(ls,pb);
if(count > 1)
{
printf("有%d个相同的名字\n",count);
printf("请输入要删除的id\n");
scanf("%d",&(pb->id));
count = delete_pos(ls,pb);
/* if(count == 1)
{
printf("删除%s此人的数据成功\n",pb->name);
sleep(1);
}
else
{
printf("删除失败,无此id的人\n");
sleep(1);
}*/
}
if(count == 1)
{
printf("删除%s此人的数据成功\n",pb->name);
sleep(1);
}
else
{
printf("删除失败,无此id的人\n");
sleep(1);
}
break;
case BACK:
printf("请按0返回上一个菜单\n");
break;
default:
printf("无效指令\n");
sleep(2);
break;
}
}
二、 牛客网一道逻辑类的题目
结果为18,下面是解释过程