1

私はC++リンクリストクラスを書いています。挿入と印刷を実装してテストしました。ただし、削除のためにノードポインタを返すことができないようです。削除しようとすると、次のエラーが発生します。

    Node.h:11: error: expected unqualified-id before "delete"
    Node.h:11: error: abstract declarator `Node*' used as declaration
    Node.h:11: error: expected `;' before "delete"

    Node.cpp:21: error: expected unqualified-id before "delete"
    Node.cpp:21: error: expected init-declarator before "delete"
    Node.cpp:21: error: expected `,' or `;' before "delete"

    make.exe: *** [Node.o] Error 1

    Execution terminated

これが私のコードです:

Node.h

    #ifndef Node_H
    #define Node_H


    class Node{
          int data;
          Node* next;

    public:
           Node(int data);       
           void insert(int d);
           Node* delete(int d);
           void printOut(void);
    };

    #endif

Node.cpp

    #include <stdio.h>
    #include "Node.h"

    Node::Node(int d){
          data = d;
          next = NULL;
          }

    void Node::insert(int d){

          Node* n = this;
          Node* current = new Node(d);

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

          n->next = current;
          }

    Node* Node::delete(int d){

          Node* head = this;
          Node* n = this;

          if (n->data = null){
             return n;
             }

          if (n->data == d){
             return n->next;
             }

          while(n->next != NULL){

          if (n->next->data == d){
             n->next = n->next->next;
             return head;
             }

          n = n->next;

          }

        return head;

        }

    void Node::printOut(void){

         Node* n = this;

         while(n->next != NULL){
                      printf("%d ->", n->data);
                       n = n->next;                   
                       }

         printf("%d \n", n->data);

         }

主要:

    #include <iostream>
    #include <stdio.h>
    #include <cstdlib>

    #include "Node.h"
    using namespace std;

    int main (void){
        int i = 0;

        Node* root = new Node(111);
        Node* result;

        for (i = 0; i < 9; i++){
            root->insert(i);
            } 

        root->printOut();

        result = root->delete(5);

        result->printOut();

        printf("Hello j \n");

        getchar();
        delete[] root; 
        return 0;   
    }
4

3 に答える 3

4

deleteはc++キーワードであり、関数名として使用することはできませんNode* Node::delete(int d) 。関数名を次のように変更できます。Node* Node::remove(int d)

http://en.cppreference.com/w/cpp/keyword

于 2012-11-15T22:08:17.920 に答える
4

トークンdeleteC++で予約されているキーワードです。関数に別の名前を選択します(のようにremove)。

于 2012-11-15T22:06:30.987 に答える
4

以前のポスターは問題をあなたに伝えました-それdeleteは予約されたC++キーワードであり、あなたはそれをあなたの関数名に使うことができません。

私はあなたのコードに関する他のいくつかの問題を指摘したいと思います:

  1. まず第一に、あなたは電話しますdelete[] root;が、それは間違っています...rootによって割り当てられていませんnew[]が、で割り当てられてnewいるので、割り当てを解除する必要がありdeleteますdelete[]
  2. 次に、リスト内のノードを削除していません。この小さなプログラムでは問題ないかもしれません(プログラムが終了するとメモリはO / Sに戻されます)、まだメモリリークが発生しています。割り当てるすべてのポインターの割り当てをnew解除する必要があり、delete割り当てるすべてのポインターの割り当てをnew[]解除する必要がありますdelete[]。覚えておいてください、newそしてdeleteペアで来なければなりません。
  3. 最後になりましたが、単一のルートのみで構成されるリストで「printOut」を呼び出そうとするとどうなるかを見てください。何も印刷されないことがわかります。これが発生する理由のヒントについては、printOut()のコードを見て、コードを実行しているコンピューターであるかのように、コードのロジックを自分自身に伝えてください。

幸運を。

于 2012-11-15T22:17:22.643 に答える