通讯录——数据结构课设

      帮同学写了n多课设,认为蛮简单。没怎么在意,这又花20min帮人写了一个,决定发在博客上,以后有谁要类似的就直接给个链接, ;-) 机智的窝

     任务要求:

     题目描写叙述:通讯录的基本属性包含编号、姓名、性别、住址、联系电话等。要求实现最主要的功能模块例如以下:

    (1)通讯录的建立;该模块主要完毕将数据存储工作。

记录能够从文本文件里读入。也能够从键盘逐条输入记                     录。

    (2)通讯录查询;用户能够依照联系人的姓名或电话号码查询。若查到。则显示该记录的信息。否则,显示查找                失败的提示信息。

    (3)通讯录的维护;实现对记录的改动、删除、插入和排序等操作。

    (4)通讯录的输出;实现屏幕显示和将记录信息写入文本文件里

 

     功能要求及说明:

     (1)使用菜单选择操作,具有友好的人机交互提示和显示,方便用户输入及查看程序执行过程、结果。

     (2)程序能够依据用户的选择多次执行,直到用户选择退出;

     (3)对于执行解决这个问题的步骤(比如从键盘输入的数据、输出到显示器的结果),除了可以在显示器上显示以                   外。可以将处理后的结果用文件的方式保存到outfile.txt文件里。

  事实上就是对链表的一些操作了,以下直接贴代码吧:

#include <iostream>
#include <cstdio>
#include <string>
#include <fstream>

using namespace std;

typedef struct Node{ //联系人节点信息
    string name;
    string sex;
    string adress;
    string phoneNum;
    struct Node * next;
    Node(Node * p = NULL ){ next= p;}
    Node(const string &na,const string &se,const string &ad,const string &ph, Node * p = NULL){
        name = na;
        sex= se;
        adress = ad;
        phoneNum =ph;
        next= p;
    }
}Person;

class phonePage{
public :
    phonePage(){ //构造函数。
        Head = new Person();
    }
    //为新插入的联系人创建节点
    Person *creatP(string na, string se, string ad,string ph){
        Person *tmp= new Person(na,se,ad,ph);
        return tmp;
    }
    //为新插入的联系人创建节点
    Person *creatP(){
        Person *tmp= new Person();
        cout<<"输入联系人的姓名:";
        cin>> tmp->name;
        cout<<"输入联系人的性别:";
        cin>> tmp->sex;
        cout<<"输入联系人的地址:";
        cin>> tmp->adress;
        cout<<"输入联系人的号码:";
        cin>> tmp->phoneNum;
        tmp->next= NULL;
        return tmp;
    }
    //文件读取联系人
    void addPfromFile(){
        ifstream ins;
        string na,se,ad,ph;
        ins.open("input.txt");
        Person * newP;
        Person *inse;
        while(ins>>na>> se>> ad >> ph ){
            newP= creatP(na,se,ad,ph);
            inse = findLast();
            inse->next = newP;
        }
        cout<< "导入联系人完成"<<endl;
        ins.close();
    }
    //查找插入联系人的位置
    Person *findLast(){
        Person *p = Head;
        while( p->next !=NULL  )
            p=p->next;
        return p;
    }
    //键盘录入联系人信息
    void  addPformKb(){
        Person * newP =creatP();
        newP->next = Head->next;
        Head->next = newP;
    }
    //将全部联系人信息写到output.txt
    void WtoFile(){
        ofstream outs;
        outs.open("output.txt");
        Person *p = Head->next;
        while(p != NULL ){
            outs<<p->name<<" "<< p->sex << " "<< p->adress << " "<< p->phoneNum<< endl; p=p->next;
        }
        outs.close();
    }
    //改动联系人信息
    void resetPerson(Person *someP){
        if(someP == NULL ){
            cout<<"查无此人"<<endl;
        }else{
            cout<<"要改动的联系人为."<<endl;
            printP(someP);
            cout<< "又一次输入该联系人的信息."<<endl;
            cout<<"输入联系人的姓名:";
            cin>> someP->name;
            cout<<"输入联系人的性别:";
            cin>> someP->sex;
            cout<<"输入联系人的地址:";
            cin>> someP->adress;
            cout<<"输入联系人的号码:";
            cin>> someP->phoneNum;
            cout<<"改动成功."<<endl;
        }
    }
    //查找须要删除的联系人。并返回其前一节点的指针
    Person * findFrontDelP(){
        Person * q= Head;
        Person * p =Head->next;
        int cho;
        string str;
        cout<<"输入要删除的联系的信息"<<endl;
        cout<<"1:按姓名查找."<<endl;
        cout<<"2:按号码查找."<<endl;
        cout<<"输入选择:";
        cin>> cho;
        if(cho == 1 )
            cout<< "输入联系人姓名:";
        else if(cho == 2 )
            cout<< "输入联系人号码:";
        else{
            cout<< "选择输入有误."<<endl;
            return NULL;
        }
        cin>> str;
        while( p!=NULL ){
            if(cho == 1 ){
                if(p->name == str )
                    break;
            }else{
                if(p->phoneNum == str )
                    break;
            }
            p=p->next;
            q=q->next;
        }
        if(p!=NULL )
            return q;
        return NULL;
    }
    //删除某人
    void delP(){
        Person * someP= findFrontDelP();
        if( someP == NULL ){
            cout<< "联系人不存在."<<endl;
        }else{
            cout<<"要删除的联系人为:"<<endl;
            printP(someP->next);
            char suredel;
            cout<< "是否确定删除:"<<endl;
            cout<<"Y:确定删除."<<endl;
            cout<<"N:放弃."<<endl;
            cout<<"输入选项:";
            cin>> suredel;
            if(suredel == 'Y' || suredel == 'y'){
                Person * del = someP->next;
                someP->next = someP->next->next;
                delete del;
                WtoFile();
            }
        }
    }
    //查找联系人,并返回该节点指针
    Person *findP(){
        Person *p =Head->next;
        int cho;
        string str;
        cout<<"1:按姓名查找."<<endl;
        cout<<"2:按号码查找."<<endl;
        cout<<"输入选择:";
        cin>> cho;
        if(cho == 1 )
            cout<< "输入联系人姓名:";
        else if(cho == 2 )
            cout<< "输入联系人号码:";
        else{
            cout<< "选择输入有误."<<endl;
            return NULL;
        }
        cin>> str;
        while(p!=NULL){
            if(cho == 1 ){
                if(p->name == str )
                    break;
            }else{
                if(p->phoneNum == str )
                    break;
            }

            p=p->next;
        }
        if(p == NULL )
            return NULL;
        return p;
    }
    //打印全部联系人
    void printAll(){
        Person *someP= Head->next;
        int num=0;
        if(someP == NULL )
            cout<< "通讯录为空"<<endl;
        while(someP != NULL ){
            cout<< ++num<< " :"<<endl;
            printP(someP);
            someP= someP->next;
        }
    }
    //输出查找到的联系人
    void printP(Person *somebody){
        if(somebody !=NULL ){
            cout<<"姓名:" <<somebody->name      <<endl;
            cout<<"性别:" <<somebody->sex       <<endl;
            cout<<"地址:" << somebody->adress   <<endl;
            cout<<"电话:" <<somebody->phoneNum  <<endl;
        }else{
            cout<< "查无此人"<<endl;
        }
    }
private:
    Person * Head;
};

int mnue(){
    int cho;
    cout<<"------------------------"<<endl;
    cout << "      田茂茂通讯录    " << endl;
    cout<<"功能菜单:"<<endl;
    cout<<"1:通讯录的建立"<<endl;
    cout<<"2:通讯录查询"<<endl;
    cout<<"3:通讯录的维护"<<endl;
    cout<<"4:通讯录的输出"<<endl;
    cout<<"5:退出"<<endl;
    cout<<"输入选择:";
    cin>> cho;
    while(cho<1 || cho > 5){
        cout<<"输入有误,从新输入."<<endl;
        cout<<"输入选择:";
        cin>>cho;
    }
    return cho;
}


int main()
{   phonePage *tml = new phonePage();
    int cho;
    while(  cho =mnue()){
        if(cho == 1){
            int tmp;
            cout<<"1:文件里导入通讯录"<<endl;
            cout<<"2:键盘录入"<<endl;
            cout<<"输入选项:";
            cin>>tmp;
            if(tmp == 1){
                tml->addPfromFile();
            }else if(tmp == 2){
                tml->addPformKb();
            }else{
                cout<<"输入有误."<<endl;
            }
        }else if(cho == 2){
            tml->printP( tml->findP() );
        }else if(cho == 3){
            int tmp;
            cout<<"1:改动"<<endl;
            cout<<"2:删除"<<endl;
            cout<<"3:查找"<<endl;
            cout<<"输入选项:";
            cin>> tmp;
            if(tmp == 1){
                tml->resetPerson( tml->findP() );
            }else if(tmp == 2){
                tml->delP();
            }else if(tmp == 3){
                tml->printP( tml->findP() ) ;
            }else{
                cout<<"输入有误."<<endl;
            }
        }else if(cho == 4){
            cout<<"你的通讯录例如以下:"<<endl;
            tml->printAll();
            tml->WtoFile();
        }else{
            break;
        }
    }

    return 0;
}





posted @ 2016-04-12 21:13  zfyouxi  阅读(1402)  评论(0编辑  收藏  举报