2016-12-17 31 views
-2

我有一個程序,我試圖做一個單鏈表和它的副本構造函數。該程序編譯成功;然而,在運行時,它會打印它應該輸出的一半,然後在沒有打印剩餘輸出的情況下崩潰(對於不好的技術詞彙抱歉)。重載構造函數不能用於單鏈表

我有一種感覺,我的List類中的拷貝構造函數有問題,因爲程序崩潰,因爲它到達了那一點。

這裏是我的代碼:

# include<iostream> 
using namespace std; 


class Node 
{ 
    public: 
     int value; 
     Node* next; 
}; 

class List 
{ 
    public: 

     List(); 
     List(const List &other){ 
      head = new Node; 
      head = NULL; 
      Node* temp7; 
      temp7 = head; 
      Node* temp6 = other.head; 
      while (temp6 != NULL) 
      { 
       temp7 = new Node; 
       temp7->value = temp6->value; 
       temp7 = temp6; 
       temp6 = temp6->next; 
      } 
     } 


     void push_front(int value){ 
      temporary = new Node; 
      temporary->value = value; 
      temporary->next = NULL; 
      temporary->next = head; 
      head = temporary; 
     } 

     void insert_at(int index, int value){ 
      Node* temp4 = new Node; 
      temp4->value = value; 
      temp4->next = NULL; 
      if (index == 1) 
      { 
       temp4->next = head; 
       head = temp4; 
       return; 
      } 
      Node* temp5 = head; 
      for (int k = 0; k < index - 2; k++) 
       temp5 = temp5->next; 
      temp4->next = temp5->next; 
      temp5->next = temp4; 
     } 
     void remove_at(int index){ 
      Node* temp2 = head; 
      if (index == 1) 
      { 
       head = temp2->next; 
       delete temp2; 
       return; 
      } 
      for (int j = 0; j < index - 2; j++) 
       temp2 = temp2->next; 
      Node* temp3 = temp2->next; 
      temp2->next = temp3->next; 
      delete temp3; 
     } 

     string printList(void); 
    private: 
     Node* head; 
     Node* temporary; 
}; 

List::List(){ 
    head = NULL; 
} 


string List::printList(void) 
{ 
    Node* temp1 = head; 
    int counting = 0; 
    while (temp1 != NULL) 
    { 
     cout << "list[" << counting << "] == " << temp1->value << endl; 
     temp1 = temp1->next; 
     counting++; 
    } 
} 


int main() 
{ 
    List list1; 

    list1.push_front(4); 
    list1.push_front(3); 
    list1.push_front(2); 
    list1.push_front(1); 


    cout << "list1" << endl; 
    list1.printList(); 
    cout << endl; 

    List list2(list1); 

    cout << "list2" << endl; 
    list2.printList(); 
    cout << endl; 

    list1.insert_at(1, 6); 

    list2.remove_at(2); 

    cout << "list1" << endl; 
    list1.printList(); 
    cout << endl; 

    cout << "list2" << endl; 
    list2.printList(); 
    cout << endl; 


    return 0; 
} 

我無法找出錯誤的在節目源。任何人都可以請建議解決方案?

僅供參考,輸出應該是這樣的:(程序只輸出崩潰前的前5行)。

>list1 
> 
>list[0] == 1 
> 
>list[1] == 2 
> 
>list[2] == 3 
> 
>list[3] == 4 
> 
>list2 
> 
>list[0] == 1 
> 
>list[1] == 2 
> 
>list[2] == 3 
> 
>list[3] == 4 
> 
>list1 
> 
>list[0] == 1 
> 
>list[1] == 6 
> 
>list[2] == 2 
> 
>list[3] == 3 
> 
>list[4] == 4 
> 
>list2 
> 
>list[0] == 1 
> 
>list[1] == 2 
> 
>list[2] == 4 

順便說一句,這是我對堆棧溢出的第一個問題,所以如果有什麼錯了或什麼我應該做的事情,請不要猶豫,指正。

非常感謝您的幫助大家:)

***我解決了這一問題。顯然,我沒有正確地實現拷貝構造函數。反正感謝您的所有意見和建議:-)

//包含標準文件 的#include

// Use standard namespace 
    using namespace std; 

    // Declare node class 
    class Node 
    { 
     // All values are public; value of node, and next node pointer 
    public: 
     int value; 
     Node* next; 
    }; 

    // Declare singly linked list class 
    class List 
    { 
    public: 

     // Declare main constructor 
     // Declare copy constructor 
     List(); 
     List(const List &copying) : head(NULL) 
     { 
      // Use a node to move through the source linked list 
      // Set the size of the new linked list 
      // For every node in old list, copy it to a new node and link it to the new singly linked list 
      Node* cur = copying.head; 
      int size = copying.size(); 
      Node* end = NULL; 
      for(int q = 0; q < size; q++) 
      { 
       Node* n = new Node; 
       n->value = cur->value; 
       if (head == NULL) 
       { 
        head = n; 
        end = head; 
       } 
       else 
       { 
        end->next = n; 
        end = n; 
       } 
       cur = cur->next; 
      } 
      end->next = NULL; 
     } 

     // Push front a new node 
     // Add its value and set its next pointer to NULL 
     void push_front(int value){ 
      temporary = new Node; 
      temporary->value = value; 
      temporary->next = NULL; 
      temporary->next = head; 
      head = temporary; 
     } 

     // Insert node between x and x+1 
     // Get the new node's value 
     // Create the new node by moving from the head->next method 
     // Add the value and set up the node 
     void insert_at(int index, int value){ 
      Node* temp4 = new Node; 
      temp4->value = value; 
      temp4->next = NULL; 
      if (index == 1) 
      { 
       Node* temp9 = head->next; 
       temp4->next = temp9; 
       head->next = temp4; 
       return; 
      } 
      Node* temp5 = head; 
      for (int k = 0; k < index - 2; k++) 
       temp5 = temp5->next; 
      temp4->next = temp5->next; 
      temp5->next = temp4; 
     } 

     // Remove node number [index] 
     // Get the head 
     // Iterate through the linked list 
     // When at the node before the one that has to be deleted, set its value to the node after the next one 
     // Delete the node that should be deleted 
     void remove_at(int index){ 
      Node* temp2 = head; 
      if (index == 1) 
      { 
       head = temp2->next; 
       delete temp2; 
       return; 
      } 
      for (int j = 0; j < index - 1; j++) 
       temp2 = temp2->next; 
      Node* temp3 = temp2->next; 
      temp2->next = temp3->next; 
      delete temp3; 
     } 

     // Simple function to pass the head of a singly linked list 
     // Simple function to get the size of a function 
     Node * PassHead(void); 
     int size()const; 
    private: 
     Node* head; 
     Node* temporary; 
    }; 

    // Returns head 
    Node * List::PassHead() 
    { 
     return head; 
    } 

    // Constructor sets head to NULL 
    List::List(){ 
     head = NULL; 
    } 

    // Gets the size of the singly linked list. 
    // While the node_>next is not NULL, add 1 to counter 
    // return counter 
    int List::size()const { 
     Node* temp1 = head; 
     int counting = 0; 
     while (temp1 != NULL) 
     { 
      counting++; 
      temp1 = temp1->next; 
     } 
     return counting; 
    } 

    // Same function as the size() function, excetp this time, print the node value while iterating through list 
    // Nothing returned 
    void printList(List object) 
    { 
     Node* temp1 = object.PassHead(); 
     int counting = 0; 
     while (temp1 != NULL) 
     { 
      cout << "list[" << counting << "] == " << temp1->value << endl; 
      temp1 = temp1->next; 
      counting++; 
     } 
    } 

    // Declare main function here 
    int main() 
    { 
     // Object of List 
     List list1; 

     // Push some values 
     list1.push_front(4); 
     list1.push_front(3); 
     list1.push_front(2); 
     list1.push_front(1); 

     // Print the first list 
     cout << "list1" << endl; 
     printList(list1); 
     cout << endl; 

     // Copy constructor for second list 
     List list2(list1); 

     // Print second list 
     cout << "list2" << endl; 
     printList(list2); 
     cout << endl; 

     // Insert node in first list 
     list1.insert_at(1, 6); 

     // Remove node in second list 
     list2.remove_at(2); 

     // Print first list 
     cout << "list1" << endl; 
     printList(list1); 
     cout << endl; 

     // Print second list 
     cout << "list2" << endl; 
     printList(list2); 
     cout << endl; 


     // Program ran successfully 
     return 1; 
    } 
+0

你在你的拷貝構造函數中忘記了一個'}'。 – Rakete1111

+0

您應該包含** complete **錯誤消息。它們通常包含一個行號,這對於發現問題很有幫助。 –

+0

謝謝@ Rakete1111!我錯過了那個障礙。但是,即使在添加之後,它仍然不起作用。 –

回答

0

我不能在此頁上回答正常的,由於沒有足夠的積分。但我找到了一些東西。

List(const List &other){ 
      head = new Node; 
      head = NULL; 
      Node* temp7; 
      temp7 = head; 
      Node* temp6 = other.head; 
      while (temp6 != NULL) 
      { 
       temp7 = new Node; 
       temp7->value = temp6->value; 
       temp7 = temp6; 
       temp6 = temp6->next; 
     } 

右括號在哪裏?下一個函數將在名爲List的函數中創建(const List & other){.... 添加一個括號並重試。 希望有幫助;)

+0

感謝@DotBlack,我修復了這個錯誤,並且代碼編譯正確,但它仍然崩潰而不輸出應該是的所有行。 –

+0

你好@Newbie編程。我試着修復你的代碼,但在那裏還有一些問題。如果您願意,我可以通過Skype(名稱= firephoenix1997)來幫助您。 – DotBlack

+0

感謝您的報價,@DotBlack!非常感謝,雖然我沒有Skype。我設法找出問題的主要根源(它在複製構造函數中),並更新了上面的代碼。再次感謝 :) –