单链表通讯录作业

这篇博客详细介绍了如何使用C++编程语言设计并实现一个基于单链表的通讯录系统,涵盖了节点定义、链表操作以及增删查改联系人等功能。
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h> 
#include<iostream>
using namespace std; 
typedef struct Stu
{
long long id;//学生ID 
char name[10];//学生姓名 
long long tel;//学生电话号码 
struct Stu*next;//next链表指针 
}stud;//使用long long长整型是因为int和long的数据类型的长度不足以支持到11位 
FILE *fp; //文件指针,便于接下来对文件进行操作 

void CreLi(stud *&s)//以函数的形式创建链表,方便在主函数中直接调用 
{
s=(stud *)malloc(sizeof(stud));//分配空间 
s->next=NULL;//将头指为空 
}

void Loading(stud * &s,long long ID,char *Name,long long Tel)//将新建的数据以节点形式传入 
{//使用&是为了将载入数据的链表带回主函数 
stud *r,*t=s;//将t指为s,并用while函数指向其末尾; 
while(t->next!=NULL)
{
t=t->next;
}
r=(stud *)malloc(sizeof(stud));//为临时数据的临时节点分配空间 
r->id=ID;
strcpy(r->name,Name);
r->tel=Tel;
//以上三步将传入的值赋给临时节点 
r->next=NULL;//确保末尾指向空 
t->next=(stud*)malloc(sizeof(stud));//为t的下一节点分配空降 
t->next=r;//将临时变量的值赋给t链 
}

bool DeLi(stud * &s,long long ID) //删除记录
{
stud *r=s,*q,*pre=s;
r=r->next;
while(r!=NULL && r->id!=ID)//执行查找 
{
pre=pre->next;
r=r->next;
}
if(r==NULL){//未找到输出提示 
printf("Record does not exist\n");
return false;
}
else//找到则执行删除操作 
{
q=pre->next;//删除值赋给q 
pre->next=q->next;//踢掉待删值 
free(q);//删除完成 
printf("successfully delete\n");
return true;
}
}

void Show(stud *s) //输出联系人 
{
if(s!=NULL)
s=s->next;
if(s!=NULL)
{
while(s!=NULL)//疯狂循环,疯狂输出 
{ 
printf("ID\t\tName\tTel\n");
printf("%lld\t",s->id);
printf("%s\t",s->name);
printf("%lld\n\n",s->tel);
s=s->next;
}
if(s==NULL)
printf("Address book printed!\n");
}
else
{
printf("Address book is empty! Please add contacts first!\n");
}
}

bool NOS(stud *&s,char *Name) //按名字查找
{
stud *p,*pre=s;
p=s->next;
while(p!=NULL&&(strcmp(p->name,Name)))//名字对应查找 
{//strcmp用来判断字符串是否相等,即对链表的遍历 
pre=pre->next;
p=p->next;
}
if(p==NULL)
{
printf("The contact was not found in the address book!\n");
return false;
}
else
{
printf("ID\t\tName\tTel\n");
printf("%lld\t",p->id);
printf("%s\t",p->name);
printf("%lld\n\n",p->tel);
return true;
}
}

void Saving(stud * s) //将内存中的联系人文件存入本地磁盘 
{
fp=fopen("data.txt","w"); //打开文件 
//w是指:打开一个文本文件,清除原内容,写入文件。如果文件不存在,则会创建一个新文件。 
if(s!=NULL)
s=s->next;
while(s!=NULL)
{
fprintf(fp,"%s\t%lld\t%lld\n",s->name,s->id,s->tel);//写入文件,按行写入 
//分别以长整型,字符串,长整型写入txt文件中。 
s=s->next;//每写入一个联系人数据,就将链表指向下一节点。 
}
fclose(fp);//正确的关闭文件,确保真的写入数据 
}

void Empty(stud * &s) //清空记录
{
stud *p=s,*q=s;
p=p->next; 
if(p!=NULL)
q=p->next;//一前一后循环删除 
while(q!=NULL)
{
free(p);//清除临时节点 
p=q;//重给链值 
q=p->next;//指向下一待删节点 
}
free(p);//清除最后一次赋值 
s->next=NULL;//s最终指向空 
printf("Address Book clearance completed\n");
}

void Start(stud *s) // 初始化和载入文件中数据
{
system("color 07"); //屏幕、 字体颜色
char Name[10];
long long ID,Tel;
//a是以追加模式打开文件,不会清除原有数据,若没有,则新建 
fp=fopen("data.txt","a"); //就是为了确保文件没有时可以再建一个 
fclose(fp);
fp=fopen("data.txt","r");//读取原有文件 
while(fscanf(fp,"%s%lld%lld",Name,&ID,&Tel)!=EOF) //从文件中读入数据
Loading(s,ID,Name,Tel);//不停地将文件中的数据写入链表并传出。 
fclose(fp);//确保关闭 
printf("File data read status: read successfully!\n");
}

int main()
{
int n;
long long ID,Tel;
char Name[10];
stud *s;
CreLi(s);
Start(s);
	cout<<endl;
	cout<<"*****主菜单*****"<<endl;
	cout<<"1:添加记录"<<endl;
	cout<<"2:删除记录"<<endl;
	cout<<"3:输出记录"<<endl;
	cout<<"4:按姓名查找"<<endl;
	cout<<"5:保存数据"<<endl;
	cout<<"6:清空记录"<<endl;
	cout<<"7:退出"<<endl;	
while(~scanf("%d",&n))
{
if(n>=1&&n<=6){
switch(n)
{
case 1:
{
printf("Enter student id:\n");
scanf("%lld",&ID);
printf("Enter the name:\n");
scanf("%s",&Name);
printf("Enter phone number:\n");
scanf("%lld",&Tel); 
Loading(s,ID,Name,Tel);break;}
case 2:
{printf("Enter student id:\n");
scanf("%lld",&ID);
DeLi(s,ID);break;}
case 3:
{Show(s);break;}
case 4:
{printf("Enter the name:\n");
scanf("%s",&Name);
NOS(s,Name);break;}
case 5:
{Saving(s);printf("Data saved successfully\n");break;}
case 6:
{Empty(s);break;}
}
}
if(n==7)
{
printf("It's coming to an end. Just a moment, please.\n");
Sleep(3000); 
break;}
	cout<<endl;
	cout<<"*****主菜单*****"<<endl;
	cout<<"1:添加记录"<<endl;
	cout<<"2:删除记录"<<endl;
	cout<<"3:输出记录"<<endl;
	cout<<"4:按姓名查找"<<endl;
	cout<<"5:保存数据"<<endl;
	cout<<"6:清空记录"<<endl;
	cout<<"7:退出"<<endl;	
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值