2017-10-23 10 views
0

リンクリストの学習を始めてから1週間が過ぎました。だから、今日私はC++で学んだリンクリストを実装しました。実行しようとしている間、コードは無限ループの無限ループに入ります。私はコードをデバッグしようとしましたが、コードで何が問題になっているのか分かりません。コードは以下の通りです。ヘルプdisplay()が間違っている、手始めにappreciated.Thanks単独リンクリスト無限ループ

#include <iostream> 
using namespace std; 

struct node{ 
int data; 
node * next; 
}; 

class singly{ 
private: 
node * head,*tail; 
public: 
singly(){ 
    head=NULL; 
    tail=NULL; 
} 

void createNode(int value){ 
    node * temp = new node; 
    temp->data=value; 
    temp->next=NULL; 
    if(head==NULL){ 
     head=temp; 
     tail=temp; 
     temp=NULL; 
    } 

    else{ 
     tail->next=temp; 
     tail=temp; 
    } 
} 

void display(){ 
    node * temp = new node; 
    head=temp; 

    while(temp!=NULL){ 
     cout << temp->data << "\t" << endl; 
     temp->next=temp; 
    } 
} 

void insert_end(int value){ 
    node*newnode = new node; 
    node*temp = new node; 
    newnode->data=value; 
    newnode->next=NULL; 
    temp=head; 

    while(temp->next!=NULL){ 
     temp = temp->next; 
    } 
    temp->next=newnode; 
} 

void delete_node(){ 
    node*current = new node; 
    node*previous = new node; 
    current = head; 
    while(current->next!=NULL){ 
     previous=current; 
     current=current->next; 
    } 

    tail=previous; 
    previous->next=NULL; 
    delete current; 
} 
}; 

int main(){ 

singly lists; 
lists.createNode(32); 
lists.createNode(654); 
lists.createNode(34); 
lists.createNode(234); 

cout<<"\n--------------------------------------------------\n"; 
cout<<"---------------Displaying All nodes---------------"; 
cout<<"\n--------------------------------------------------\n"; 
lists.display(); 
cout<<"\n--------------------------------------------------\n"; 
cout<<"-----------------Inserting At End-----------------"; 
cout<<"\n--------------------------------------------------\n"; 
lists.createNode(55); 
lists.display(); 
cout<<"\n--------------------------------------------------\n"; 
cout<<"-----------------Deleing At End-------------------"; 
cout<<"\n--------------------------------------------------\n"; 
lists.delete_node(); 
lists.display(); 


} 
+1

のように見えることができますか?コード全体をデバッグすることは期待できません。 – eshirima

+0

'new'キーワードが何をしているかについていくつかの調査をすることをお勧めします。このコードから判断すると、実際に理解できません。 –

+2

' display'と 'delete_node'の両方が壊れています。ノードをリストに追加する関数にのみ 'new'を書くべきです。ポインタを作成するために 'new'を使用しません - ' node * temp = head; 'は、' head'と同じ値を持つポインタを必要とする場合に必要なものです。 – molbdnilo

答えて

1

意味をなさないdisplayメンバ関数を使用することを確認します。 データメンバheadが新しく作成された初期化されていないtempを上書きします。

node * temp = new node; 
    head=temp; 

したがって、この関数は未定義の動作を呼び出します。

機能は

void display() 
{ 
    for (node * temp = head; temp != nullptr; temp = temp->next) 
    { 
     cout << temp->data << "\t"; 
    } 
} 

のように見えることも、データメンバーinsert_endも間違っている、それを次のよう

std::ostream & display(std::ostream &os = std::cout) 
{ 
    for (node * temp = head; temp != nullptr; temp = temp->next) 
    { 
     os << temp->data << "\t"; 
    } 

    return os; 
} 

を定義することをお勧めします。 headtailnullptrと等しく、それらを変更しないことを考慮していません。

関数はメンバ関数delete_nodeは、まず、片方向リンクリストのために意味をなすと再び間違っていると未定義の動作を呼び出していない、次のよう

void insert_end(int value) 
{ 
    node *newnode = new node { value, nullptr }; 

    if (tail == nullptr) 
    { 
     head = tail = newnode; 
    } 
    else 
    { 
     tail = tail->next = newnode; 
    } 
} 

を定義することができます。関数は、リストから最初のノードを削除する必要があります。あなたがリストから最後のノードを削除したい場合は

にもかかわらず、この関数は、それが無限ループに入るんどの時点で

void delete_node() 
{ 
    if (head != nullptr) 
    { 
     tail = nullptr; 
     node *current = head; 

     while (current->next) 
     { 
      tail = current; 
      current = current->next; 
     } 

     if (tail == nullptr) 
     { 
      head = tail; 
     } 
     else 
     { 
      tail->next = nullptr; 
     } 

     delete current; 
    } 
} 
+0

おかげで、私はまだ学習段階にあるので、しかし、これは私を大きく助け、私の問題を解決しました。 –

+0

@MazharKhanいいえ、まったくありません。どういたしまして。:) –

0
  1. です。更新をtemp = temp->next;にし、node * temp = headとして初期化し、2行目を必要としないようにすることもできます。

  2. はあなたのdelete_node()がに再書き込むことができます。コメントで述べたように

    if (head->next == NULL) // handles the case that it consists of 1 element 
    { 
        delete head; 
        head = NULL; 
    } 
    else 
    { 
        node *nextToEnd = head; 
        node *end = head->next; 
        while (end->next != NULL) 
        { 
         nextToEnd = end; 
         end = end->next; 
        } 
        delete end; 
        nextToEnd->next = NULL; 
    } 
    
  3. new keyword

+0

ありがとうございました –