问答详情
源自:4-2 线性表应用之通讯录(二)

老师布置的作业

是根据提示用户输入姓名和联系电话来找到链表中位置进行删除吗

void deleteperson(List *pList)
{
	Node node;
	Person person;
	cout<<"你要删除的联系人姓名和联系电话:";
	cin>>person.name>>person.phone;
	node.data = person;
	int i = pList->LocateElem(&node);
	pList->ListDelete(i,&node); 
}


提问者:mypollyanna 2016-08-28 23:56

个回答

  • kming
    2016-08-29 11:00:21
    已采纳

    先找到联系人位置在删除,自己写的,仅供参考

    void deletePerson(List<Node> *pl,Node *temp)
    {
       Node node;
       cout << "请输入姓名:" << endl;
       cin >> node.data.name;
       cout << "请输入电话:" << endl;
       cin >> node.data.phone;
       int locate = pl->LocateElem(&node);//先查找联系人的位置
       if(locate == -1)
       {
           cout << "没找到此联系人" << endl;
           return;
       }
       pl->ListDelete(locate,temp);//删除联系人
       cout << "成功删除联系人" << endl;
    }

  • 慕慕5109576
    2019-07-28 14:59:30


    void deleteperson(List*pList)

    {

    Node node;

    cout << "删除全部请按 <1> -- 删除指定姓名请按 <2>--删除指定号码请按<3>" <<endl;

    int num= 0;

    int flag = 0;

    cin >> num;

    switch (num)

    {

    case 1:

    pList->ClearList(); break;

    case 2:

    cout << "请输入姓名:";

    cin >> node.data.name;

    case 3:

    cout << "请输入电话:";

    cin >> node.data.phone;

    flag = pList->LocateElem(&node);

    if (flag == -1)

    {

    cout << "通讯录无此联系人,请重新输入!" << endl;

    break;

    }

    else

    {

    pList->ListDelete(flag, &node);

    break;

    }

    default:

    break;

    }

    }

    另外在LocateElem中改变一下

    int List::LocateElem(Node *pNode)

    {

     Node*currentNode=m_pList;

     int count=0;

     while(currentNode->next!=NULL)

    {

     currentNode=currentNode->next;

     if(currentNode->data.name==pNode->data.name||currentNode->data.phone==pNode->data.phone)

     {return count;}

     count++;

    }

     return -1;

    }

    这样就可以实现不论你输入电话或者号码任意一个条件都可以删除对应的全部信息

  • 慕斯5158549
    2018-01-05 20:01:50

    void deletePerson(List *plist)//删除联系人 方法2

    {

    cout<<"是否删除所有联系人输入1"<<endl;

    int  order;

    cin>>order;

    if (order==1)

    {

    plist->ClearList();

    cout<<"所有联系人已经删除"<<endl;

    else

    {

    int sequenceNumber;

    cout<<"请输入序号 : ";

    cin>>sequenceNumber; 

    sequenceNumber<1||sequenceNumber>plist->ListLength()?cout<<"此联系人不存在"<<endl:cout<<"此联系人已经删除"<<endl;

    Node node;

    plist->ListDelete(sequenceNumber-1,&node);

    }

    }


    void List::ListTraverse()

    {

    Node *currentNode=m_pList;

    for(int k=0;k<m_iLength;k++)

    {

    currentNode=currentNode->next;

    cout<<"sequence Number  "<<k+1<<" : ";

    currentNode->printNode();

    }


    }


  • qq_张得帅_0
    2017-07-07 18:59:53

    void deletenum(List *list)
    {
     string name;
     int i;
     cout<<"请输入你要删除的联系人:"<<endl;
     cin>>name;
     Node node;
     Node node1;
     node.data.m_sName=name;
     i=list->LocateElem(&node);
     list->ListDelete(i,&node1);
     if(node1.data.m_sName==name)
     {
      cout<<"删除成功"<<endl; 
      } 
      list->ListTraverse();
    }

    修改一下LocateElem函数:

    int List::LocateElem(Node *pNode)
      {
        Node *currentNode=m_iPlist;
        int count=0;
      while(currentNode->next!=NULL)
      {
       currentNode=currentNode->next;
       if(currentNode->data.m_sName==pNode->data.m_sName)
       {
        return count;
       }
       count++;
      }
      return -1;
       
      }

    通过名字删除,个人想法,欢迎各位学友交流指正。

  • 宝慕林3490596
    2017-02-21 16:50:42

    void DeleteContacts()//删除联系人
    {
    	p->ListTraverse();
    	cout << "请输入需要删除的联系人序号:";
    	Node<MailList> DeleteContacts;
    	int number;
    	cin >> number;
    	p->ListDelete(number, &DeleteContacts);
    	if (p->ListDelete(number, &DeleteContacts) == true)
    	{
    		cout << "\n删除成功\n"<< endl;
    	}
    	else
    	{
    		cout << "\n删除失败\n"<<endl;
    	}
    }

    先遍历,我在遍历的时候,修改了一下,能够看到每个联系人的序号

    只需要输入对应的序号就可以删除联系人,在删除操作上简化了


    istream &operator >> (istream &input, MailList &maillist)//运算符重载
    {
    	input >> maillist.name /*>> maillist.city >> maillist.age >> maillist.tel*/;
    	return input;
    }
    void SearchContacts()//搜索联系人
    {
    	p->ListTraverse();
    	cout << "请输入联系人的姓名,年龄,城市,手机号:\n";
    	Node<MailList> SearchContacts;
    	int number=0;
    	cin >> SearchContacts.data;
    	p->GetElem(p->LocateElem(&SearchContacts),&SearchContacts);
    	if(p->GetElem(p->LocateElem(&SearchContacts), &SearchContacts)==true)
    	{
    		cout <<"搜索成功\n\n"
    		<<"搜索到第"<< p->GetElem(p->LocateElem(&SearchContacts), &SearchContacts) <<"号的联系人信息如下\n"
    		<< "姓名:"<< SearchContacts.data.name << "\n"
    		<< "城市:" <<  SearchContacts.data.city << "\n"
    		<< "年龄:" << SearchContacts.data.age << "\n"
    		<< "手机:" << SearchContacts.data.tel << "\n\n";
    	}
    	else
    	{
    		cout << "\n未搜索到相关联系人\n\n";
    	}
    }

    同时也衍生出搜索联系人的问题,对cin>>的运算符进行了重载,靠联系人的姓名来搜索,不过暂时还没解决只输入姓名,年龄,城市,手机号其中的一项来进行搜索的问题,望大神指点迷津

  • 慕粉1021362272
    2016-12-06 19:42:53

    void deletePerson(List*pList)
    {
       char str;
       Node node;
       Person person;
       cout<<"请输入姓名: ";
       cin>>person.name;
       cout<<"请输入电话: ";
       cin>>person.phone;
       node.data=person;
       node.data=person;

       int count = pList->LocateElem(&node);
       if(count==-1)
       {
           cout<<"没有该联系人"<<endl;
           return;
       }
       else
       {
           cout<<"确定要删除此人?"<<endl;
           cin>>str;
           switch (str) {
           case 'y':
               pList->ListDelete(count,&node);
               cout<<"联系人已删除";
               cout<<"------------"<<endl;
               pList->ListTraverse();
               break;
           case 'n':
               return pList->ListTraverse();
               break;
           default:
               break;
           }

       }
    }

  • 慕粉1021362272
    2016-12-06 17:51:36

    void deletePerson(List*pList)
    {
       char str;
       Node node;
       Person person;
       cout<<"请输入姓名: ";
       cin>>person.name;
       cout<<"请输入电话: ";
       cin>>person.phone;
       node.data=person;
       node.data=person;
       int count = pList->LocateElem(&node);
       if(count==-1)
       {
           cout<<"没有该联系人"<<endl;
           return;
       }
       else
       {
           cout<<"确定要删除此人?"<<endl;
           cin>>str;
           switch (str) {
           case 'y':
               pList->ListDelete(locate,&node);
               cout<<"联系人已删除";
               cout<<"------------"<<endl;
               pList->ListTraverse();
               break;
           default:
               break;
           }
       }
    }



  • 我爱CPP3840286
    2016-09-28 20:45:05

    void removePeron(List *plist)

    {

    Node node;

    cout << "删除全部请按 <1> -- 删除指定姓名请按 <2>" <<endl;

    int num= 0;

    int flag = 0;

    cin >> num;

    switch (num)

    {

    case 1:

    plist->ClearList(); break;

    case 2:

    cout << "请输入姓名:";

    cin >> node.data.name;

    cout << "请输入电话:";

    cin >> node.data.phone;

    flag = plist->LocateElem(&node);

    if (flag == -1)

    {

    cout << "通讯录无此联系人,请重新输入!" << endl;

    break;

    }

    else

    {

    plist->ListDelete(flag, &node);

    break;

    }

    default:

    break;

    }


    }

    仅供参考 删除必须要同时输入 姓名和 电话 这样显得有点多此一举啊。不知道哪位大神可以改进。