用链表实现学生通讯录程序

学生通讯录程序: 用链表实现学生通讯录程序。 基本信息包括学号、 姓名、
班级、 籍贯、 手机、 QQ号、 电子邮箱等信息。 具体实现的管理功能如下:
(1) 输入并显示多个学生信息;
(2) 可实现学生信息的添加;
(3) 查询(至少提供按姓名和手机查询两种方式) ;
(4) 修改(只提供按照姓名进行修改) ;
(5) 删除(依据指定的信息删除如姓名、 学号等) ;
(6) 文件的导入和导出(从文件中读取若干条通讯录, 或者将通讯录输出
到文件中) 。
程序所显示的菜单内容如下:
请选择下面的菜单:
1 创建
2 添加
3 查询
4 修改
5 删除
6 显示
7 从文件导入
8 导出到文件
9 退出
请选择:
 

#include <iostream>//学生通讯录程序
#include<fstream>
using namespace std;
struct student//创建学生信息的结构体
{
    string id;//学号
    string name;//姓名
    string banji;//班级
    string jiguan;//籍贯
    string tel;//电话
    string qq;//qq号
    string email;//电子邮箱
    student* next;
};



void  menu()//菜单
{
    cout<<"\n***********请选择下面的菜单:***********\n";
    cout<<"\t 1.创建\n";//创建通信录
    cout<<"\t 2.添加\n";//添加数据
    cout<<"\t 3.查询\n";
    cout<<"\t 4.修改\n";
    cout<<"\t 5.删除\n";//依据指定的信息删除如姓名、学号等
    cout<<"\t 6.显示\n";//显示
    cout<<"\t 7.从文件导入\n";
    cout<<"\t 8.导出到文件\n";
    cout<<"\t 9.退出\n";
    cout<<"\t 请选择";
    cout<<"\n***************************************\n";
}




student* createlist(int n)//1创建
{

    student* head=new student;//生成头结点
    student* pre=head;  //pre为前一个结点
    for(int i=0; i<n; i++)
    {
        student*p=new student;//生成普通结点

        cout<<"请输入第"<<i+1<<"个同学的数据"<<endl;//输入数据
        cin>>p->id>>p->name>>p->banji>>p->jiguan;
        cin>>p->tel>>p->qq>>p->email;

        //构建结点间的关系
        pre->next=p;//前一个结点的next存放后一个结点的地址
        pre=p;//后一个结点变成了前一个结点
        p->next=NULL;//后一个结点的next里为空
    }
    system("pause");
    system("cls");
    return head;

}



void printlist(student* head)//遍历输出
{
    //cout<<"遍历链表"<<endl;
    student* p=head->next;
    while(p!=NULL)
    {
        cout<<endl;
        cout<<"学号:"<<p->id<<endl;
        cout<<"名字:"<<p->name<<endl;
        cout<<"班级:"<<p->banji<<endl;
        cout<<"籍贯:"<<p->jiguan<<endl;
        cout<<"电话:"<<p->tel<<endl;
        cout<<"qq号:"<<p->qq<<endl;
        cout<<"邮箱:"<<p->email<<endl;
        cout<<endl;
        p=p->next;

    }

    system("pause");
    system("cls");
}

void interNode(student*head)//插入
{
    int i=0;
    cout<<"你想在第几个同学后插"<<endl;
    cin>>i;
    int j=1;
    student* p=head->next;
    while(j<i)
    {
        p=p->next;
        j++;
    }
    if(j==i)
    {
        student* q=new student;
        cout<<"请输入要插入同学的数据"<<endl;//输入数据
        cin>>q->id>>q->name>>q->banji>>q->jiguan;
        cin>>q->tel>>q->qq>>q->email;
        q->next=p->next;
        p->next=q;
    }
    system("pause");
    system("cls");
}



void findelement(student* head)//查询
{
    cout<<"按电话查询输入1,按姓名查询输入2"<<endl;
    int k;
    cin>>k;
    if(k==1)
    {
        string tel;
        cout<<"输入你要查询的电话"<<endl;
        cin>>tel;
        student* p=head->next;
        while(tel!=p->tel)
        {
            p=p->next;
        }
        if(tel==p->tel)
        {
            cout<<"---查找的数据为---"<<endl;
            cout<<endl;
            cout<<"学号:"<<p->id<<endl;
            cout<<"名字:"<<p->name<<endl;
            cout<<"班级:"<<p->banji<<endl;
            cout<<"籍贯:"<<p->jiguan<<endl;
            cout<<"电话:"<<p->tel<<endl;
            cout<<"qq号:"<<p->qq<<endl;
            cout<<"邮箱:"<<p->email<<endl;
            cout<<endl;
        }
    }
    if(k==2)
    {
        string str;
        cout<<"输入你要查询的姓名"<<endl;
        cin>>str;
        student* p=head->next;
        while(str!=p->name)
        {
            p=p->next;
        }
        if(str==p->name)
        {
            cout<<"---查找的数据为---"<<endl;
            cout<<endl;
            cout<<"学号:"<<p->id<<endl;
            cout<<"名字:"<<p->name<<endl;
            cout<<"班级:"<<p->banji<<endl;
            cout<<"籍贯:"<<p->jiguan<<endl;
            cout<<"电话:"<<p->tel<<endl;
            cout<<"qq号:"<<p->qq<<endl;
            cout<<"邮箱:"<<p->email<<endl;
            cout<<endl;
        }
    }
    system("pause");
    system("cls");
}



void deleteNode(student* head)//删除
{
    int i;
    cout<<"你要删除第几个"<<endl;
    cin>>i;
    int j=1;
    student *p=head->next;
    while(j<i)
    {
        p=p->next;//链表一个一个向后走
        j++;
    }
    if(j==i)
    {
        int k;
        cout<<"删除姓名输1"<<endl;
        cin>>k;
        if(k==1)
        {
            p->name=" ";
        }
        cout<<"删除学号输2"<<endl;
        cin>>k;
        if(k==2)
        {
            p->id=" ";
        }
    }
    system("pause");
    system("cls");
}



void xiugaiNode(student* head)//修改
{
    string str;
    cout<<"请输入你要修改的同学的姓名"<<endl;
    cin>>str;
    student *p=head->next;
    while(p->name!=str)
    {
        p=p->next;
    }
    if(p->name==str)
    {
        while(1)
        {
            int k;
            cout<<"修改学号输1,修改班级输2,修改籍贯输3,修改手机输4,修改qq输5,修改email输6,退出输0"<<endl;
            cin>>k;
            if(k==0)
            {
                break;
            }
            if(k==1)
            {
                string str;
                cout<<"请输入新学号"<<endl;
                cin>>str;
                p->id=str;
            }
            if(k==2)
            {
                string str;
                cout<<"请输入新班级"<<endl;
                cin>>str;
                p->banji=str;
            }
            if(k==3)
            {
                string str;
                cout<<"请输入新籍贯"<<endl;
                cin>>str;
                p->jiguan=str;
            }
            if(k==4)
            {
                string str;
                cout<<"请输入新手机号"<<endl;
                cin>>str;
                p->tel=str;
            }
            if(k==5)
            {
                string str;
                cout<<"请输入新qq号"<<endl;
                cin>>str;
                p->qq=str;
            }
            if(k==6)
            {
                string str;
                cout<<"请输入新email"<<endl;
                cin>>str;
                p->email=str;
            }

        }

    }
    system("pause");
    system("cls");
}

void fromfile(student* head)//从文件导入
{
    ifstream ifs;
    if(!ifs)
    {
        cout<<"文件打开失败"<<endl;
    }
    else
    {
        ifs.open("student,txt",ios::in);//从文件输出
        student* p=head->next;
        while(p!=NULL)
        {
            ifs>>p->id;
            cout<<p->id<<" ";

            ifs>>p->name;
            cout<<p->name<<" ";

            ifs>>p->banji;
            cout<<p->banji<<" ";

            ifs>>p->jiguan;
            cout<<p->jiguan<<" ";

            ifs>>p->tel;
            cout<<p->tel<<" ";

            ifs>>p->qq;
            cout<<p->qq<<" ";

            ifs>>p->email;
            cout<<p->email<<endl;

            p=p->next;
        }
        cout<<"文件导入成功"<<endl;
    }
    ifs.close();
    system("pause");
    system("cls");
}


void tofile(student* head)//保存到文件
{
    ofstream ofs;
    if(!ofs)
    {
        cout<<"文件打开失败"<<endl;
    }
    else
    {
        ofs.open("student.txt",ios::out);
        student* p=head->next;
        while(p!=NULL)
        {
            ofs<<p->id<<" ";
            ofs<<p->name<<" ";
            ofs<<p->banji<<" ";
            ofs<<p->jiguan<<" ";
            ofs<<p->tel<<" ";
            ofs<<p->qq<<" ";
            ofs<<p->email<<" ";
            p=p->next;
        }
        cout<<"文件保存成功"<<endl;
    }
    ofs.close();
    system("pause");
    system("cls");
}

int main()
{
    int number;//功能键
    int n;//学生的的个数
    cout<<"输入学生数:"<<endl;
    cin>>n;
    student* head1;
    while(1)
    {
        menu();
        cin>>number;
        switch(number)
        {
        case 1:// 创建通讯录并录入学生信息
            head1=createlist(n);
            break;
        case 2:
            interNode(head1);//添加
            break;
        case 3:
            findelement(head1);//查询
            break;
        case 4:
            xiugaiNode(head1);//修改
            break;
        case 5:
            deleteNode(head1);//删除
            break;
        case 6:
            printlist(head1);//输出
            break;
        case 7:
            fromfile(head1);//从文件导入
            break;
        case 8:
            tofile(head1);//保存到文件
            break;
        case 9:
            exit(0);//退出
            break;
        default:
            break;
        }
    }
    return 0;
}


//至今写过最长的代码

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值