2016-10-05 95 views
1

我必須設計一個程序,允許用戶輸入雙向鏈表中的5個節點的信息,然後按字母順序對雙向鏈表進行排序。它跳過允許用戶輸入地址,不打印除名稱外的任何信息,也不按字母順序對列表進行排序。我究竟做錯了什麼?程序跳過std :: getline

#include <iostream> 
#include <string> 

struct node 
{ 
    std::string firstName; 
    std::string lastName; 
    std::string address; 
    long phoneNum; 
    node *next; 
    node *prev; 
}; 

bool isEmpty(node *head); 
void insertAsFirstElement(node *&head, node *&last, std::string firstName, std::string lastName, std::string address, long phoneNum); 
void insert(node *&head, node *&last, std::string firstName, std::string lastName, std::string address, long phoneNum); 
void searchFor(node *&last, std::string lastName); 
void showList(node *current); 


bool isEmpty(node *head) 
{ 
    if(head == NULL) 
     return true; 
    else 
     return false; 
} 


void insertAsFirstElement(node *&head, node *&last, std::string firstName, std::string lastName, std::string address, long phoneNum) 
{ 
    node *temp = new node; 
    temp->firstName = firstName; 
    temp->lastName = lastName; 
    temp->address = address; 
    temp->phoneNum; 
    temp->next = NULL; 
    temp->prev = NULL; 
    head = temp; 
    last = temp; 
} 

void insert(node *&head, node *&last, std::string firstName, std::string lastName, std::string address, long phoneNum) 
{ 

    if(isEmpty(head)) 

     insertAsFirstElement(head, last, firstName, lastName, address, phoneNum); 

    else 
    { 
     node *temp = new node; 
     temp->firstName = firstName; 
     temp->lastName = lastName; 
     temp->address = address; 
     temp->phoneNum; 

     int result = lastName.compare(last->lastName); 

     if (result < 0) 
     { 
      temp->next = head; 
      head->prev = temp; 
      temp->prev = NULL; 
      head = temp; 
     } 

     else if (result > 0) 
     { 
      temp->next = NULL; 
      temp->prev = last; 
      last->next = temp; 
      last = temp; 
     } 

    } 

} 

void searchFor(node *&last, std::string findName) 
{ 
    node *temp = last; 
    while (temp != NULL) 
    { 
     if (temp->lastName == findName) 
     { 
      std::cout << temp->firstName << " " << temp->lastName << " " << temp->address << " " << temp->phoneNum << std::endl;; 
     } 

     temp = temp->prev; 
    } 
} 


void showList(node *current) 
{ 
    if(isEmpty(current)) 
     std::cout << "The list is empty\n"; 
    else 
    { 
     std::cout << "The list contains: \n"; 
     while(current != NULL) 
     { 
      std::cout << current->firstName << " " << current->lastName << " " << current->address << " " << current->phoneNum << std::endl; 
      current = current->next; 
     } 
    } 
} 

int main() 
{ 
    node *head = NULL; 
    node *last = NULL; 
    std::string firstName; 
    std::string lastName; 
    std::string address; 
    long phoneNum; 

    int count; 
    count = 5; 
    while (count > 0) 
    { 
     std::cout << "Enter the first name of person #" << count << ":\n"; 
     std::cin >> firstName; 
     std::cout << "Enter the last name of person #" << count << ":\n"; 
     std::cin >> lastName; 
     std::cout << "Enter the address of person #" << count << ":\n"; 
     std::getline(std::cin,address); 
     std::cout << "Enter the phone number of person #" << count << ":\n"; 
     std::cin >> phoneNum; 
     insert(head, last, firstName, lastName, address, phoneNum); 
     count = count - 1; 
    } 

    showList(head); 

    std::string findName; 
    std::cout << "What is the last name of the person you would like to find?\n"; 
    std::cin >> findName; 

    searchFor(last, findName); 

    return 0; 

} 

回答

1

您的問題是,你是混合cin >>getline這是用C++問題由於尾隨的換行符,什麼不是。

好的做法是始終使用getline,然後使用stringstream將該行分割爲標記。例如,我修改您的解決方案,只使用函數getline和字符串流(注:您需要#include <sstream>你的文件的頂部

你可以閱讀更多有關問題與混合cin >>getline以及其他方式來解決他們here

int main() 
{ 
    node *head = NULL; 
    node *last = NULL; 
    std::string firstName; 
    std::string lastName; 
    std::string address; 
    std::string phoneNumStr; 
    long phoneNum; 

    int count; 
    count = 5; 
    while (count > 0) 
    { 
     std::cout << "Enter the first name of person #" << count << ":\n"; 
     std::getline(std::cin,firstName); // no use of cin >> 
     std::cout << "Enter the last name of person #" << count << ":\n"; 
     std::getline(std::cin,lastName); // no use of cin >> 
     std::cout << "Enter the address of person #" << count << ":\n"; 
     std::getline(std::cin,address); 
     std::cout << "Enter the phone number of person #" << count << ":\n"; 
     std::getline(std::cin,phoneNumStr); 
     std::stringstream s(phoneNumStr); // no use of cin. Using stringstream to break up line and extract it into phoneNum 
     s >> phoneNum; 
     insert(head, last, firstName, lastName, address, phoneNum); 
     count = count - 1; 
    } 

    showList(head); 

    std::string findName; 
    std::cout << "What is the last name of the person you would like to find?\n"; 
    std::cin >> findName; 

    searchFor(last, findName); 

    return 0; 
}