本程序是大一C语言的练习,使用了链表,文件读写等。现在分享出来,有需要的同学可以看看。觉得还不错的话,点赞支持一下吧!
你的点赞,是我坚持的动力!
完整源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define MAX_SIZE 15//最大容量
//定义数据节点
typedef struct linkman {
char name[48];
char telephoneNumber[15];
char email[20];
int kind;//种类 1-办公 2-个人 3-商务
struct linkman* next;
}*Linkman,link;
void menu(void);//菜单
Linkman addPeople(Linkman head);//增加联系人
void call(Linkman head);//拨打联系人
void change(Linkman head);//修改联系人
Linkman del(Linkman head);//删除联系人
void show(Linkman head);//查看所有联系人
//全局变量
int linkman_count = 0;//联系人数量
Linkman tail = NULL;//保存指针末尾地址
int main()
{
int ch;
Linkman head = NULL;
system("color 0B");//背景与字体颜色
//readLinkman(&head);
while (1) {
system("cls");
menu();
printf("请输入相应数字选择功能:\n");
scanf("%d", &ch);
fflush(stdin);
switch (ch) {
case 1:head=addPeople(head); break;//添加联系人
case 2:call(head); break;//拨打联系人
case 3:change(head); break;//修改联系人
case 4:head=del(head); break;//删除联系人
case 5:show(head); break;//查看联系人
case 6:
printf("欢迎下次使用!程序已结束。。。");
return 0;
break;//退出程序
default:printf("请输入正确数字进行选择:\n");
}
system("pause");
}
return 0;
}
//------------------------------------------------------- 子函数 ----------------------------
void menu(void) {
printf("============欢迎使用手机通讯录管理系统!==============\n");
printf("||================================================||\n");
printf("|| 1)增加联系人 2)拨打联系人 ||\n");
printf("|| 3)修改联系人 4)删除联系人 ||\n");
printf("|| 5)显示当前通讯录 6)退出程序 ||\n");
printf("||================================================||\n");
}
Linkman addPeople(Linkman head)
{
if (linkman_count >= MAX_SIZE)
{
printf("存储空间已满!\n");
return head;
}
Linkman p, temp=head;
p = (Linkman)malloc(sizeof(struct linkman));
p->next = NULL;
if (p == NULL) {
printf("内存分配失败了\n");
exit(1);
}
printf("请输入联系人姓名:\n");
scanf("%s", p->name);
printf("请输入联系人电话号:\n");
scanf("%s", p->telephoneNumber);
printf("请输入联系人类型:\n");
printf("1-办公 2-个人 3-商务\n");
scanf("%d", &(p->kind));
if(p->kind<1||p->kind>3)
{
printf("输入数据不合法!添加失败!\n");
return head;
}
printf("请输入联系人的电子邮件:\n");
scanf("%s", p->email);
//检验是否重复
while (temp)
{
if (strcmp(p->name, temp->name) == 0 || strcmp(p->telephoneNumber, temp->telephoneNumber) == 0)
{
printf("数据录入重复,已取消录入!\n");
free(p);
return head;
}
temp = temp->next;
}
//加入链表中 采用尾插法
if (!tail)
{
tail = p;
head = p;
}
else
{
tail->next = p;
tail = p;
}
linkman_count++;
printf("添加成功!\n");
return head;
}
void call(Linkman head)
{
Linkman p = head;
int ct = 1;
printf("以下是所有的联系人的信息:\n");
while (p)
{
printf("联系人%d 姓名:%s\n", ct,p->name);
ct++;
p = p->next;
}
p = head;
char name[30];
printf("\n请输入您所要拨打的联系人姓名:");
scanf("%s", name);
while (p)
{
if (strcmp(p->name, name) == 0)
{
int i = 0;
while (p->telephoneNumber[i])
{
printf("%c", p->telephoneNumber[i++]);
Sleep(400);//延迟
Beep(523, 500);//声音
}
Beep(323, 500);
return;//返回
}
p = p->next;
}
printf("输入的联系人不存在!\n");
return;
}
void change(Linkman head)
{
Linkman p = head,tmp;
int ct = 1;
printf("以下是所有的联系人的信息:\n");
while (p)
{
printf("联系人%d 姓名:%s\n", ct, p->name);
ct++;
p = p->next;
}
p = head;
char name[30];
printf("\n请输入您所要修改的联系人姓名:");
scanf("%s", name);
while (p)
{
if (strcmp(p->name, name) == 0)
{
//修改
char kind_name[3][10] = { "办公","个人","商务"};
printf("\n%s的基本信息如下:\n",p->name);
printf("电话号:%s\n", p->telephoneNumber);
printf("分类:%s\n",kind_name[p->kind-1]);
printf("电子邮件:%s\n", p->email);
printf("===================================\n");
char phone[20]="\0", email[30] = "\0";
int kind;
name[0] = '\0';
printf("请输入修改后的姓名:");
scanf("%s", name);
printf("请输入修改后的电话号码:");
scanf("%s", phone);
printf("请输入修改后的分类:");
printf("1-办公 2-个人 3-商务\n");
scanf("%d", &kind);
if(kind<1||kind>3)
{
printf("数据不合法!修改失败!\n");
return;
}
printf("请输入修改后的电子邮件:");
scanf("%s", email);
//判重
tmp = head;
while (tmp)
{
if (tmp != p)
{
if (strcmp(name, tmp->name) == 0 || strcmp(phone, tmp->telephoneNumber) == 0)
{
printf("数据重复,修改失败!\n");
return;
}
}
tmp = tmp->next;
}
//赋值
strcpy(p->name, name);
strcpy(p->telephoneNumber, phone);
p->kind = kind;
strcpy(p->email, email);
printf("修改成功!\n");
return;//返回
}
p = p->next;
}
printf("输入的联系人不存在,修改失败!\n");
return;
}
Linkman del(Linkman head)
{
Linkman p = head, pre=NULL;
int ct = 1;
printf("以下是所有的联系人的信息:\n");
while (p)
{
printf("联系人%d 姓名:%s\n", ct, p->name);
ct++;
p = p->next;
}
p = head;
char name[30];
printf("\n请输入您所要删除的联系人姓名:");
scanf("%s", name);
while (p)
{
if (strcmp(p->name, name) == 0)
{
if (pre == NULL)//删除的是头节点
{
head = p->next;
}
else if(p->next==NULL)//删除的是尾节点
{
tail = pre;
pre->next = NULL;
}
else
{
pre->next = p->next;
}
free(p);//释放空间
linkman_count--;//人数减少
printf("删除成功!\n");
return head;
}
pre = p;//保存上一个节点
p = p->next;//下一个节点
}
printf("输入的联系人不存在,删除失败!\n");
return head;
}
void show(Linkman head)
{
int n;
printf("请输入您想查看的联系人类型:\n");
printf("1-办公 2-个人 3-商务\n");
scanf("%d", &n);
if (n < 1 || n>3)
{
printf("输入数据不合法!请输入1或2或3.。。\n");
return;
}
Linkman p = head;
int ct = 1;//序号
char kind_name[3][10] = { "办公","个人","商务" };
printf("您选择的是%s类的联系人有:\n",kind_name[n-1]);
while (p)
{
if (p->kind == n)
{
printf("联系人%d", ct);
printf("姓名: % s\n", p->name);
printf("电话号码:%s\n", p->telephoneNumber);
printf("===============================================\n");
ct++;
}
p = p->next;
}
return;
}