0

これがxorリンクリスト実装の私のコードです

#include<iostream>

using namespace std;

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

node *start=NULL;
node *end=NULL;

node *newnode(int v)
{
    node *np=new node;
    np->v=v;
    np->next=NULL;
    return np;
}

//returns the xor of two nodes
node *xor(node *a,node *b)
{
    return (node*)((long long)(a)^(long long)(b));
}

void insert(node *current,node *prev,node *np)
{
    if(start==NULL)
    {
        np->next=xor(prev,NULL);
        start=np;
        end=np;
    }
    else
    {
        insert(xor(prev,current->next),current,np);
    }
}

void displayforward(node *start,node *prev)
{
    if(start==NULL) return ;
    cout<<start->v<<"-> ";
    displayforward(xor(start->next,prev),start);
}

void displayBackward(node *end, node *prev){
    if(end == NULL) return;

    cout<< end->v<<" -> ";
    displayBackward( xor(end->next, prev), end);
}

int main()
{
    int a[] = {1,2,3,4,5,6,7,8,9,10}, n = 10;

    for(int i=0; i < n; i++){
        node *prev = NULL;
        insert(start, prev, newnode(a[i]));
    }

    cout<<"Forward: \n";
    node *prev=NULL;
    displayforward(start, prev);

    cout<<"\nBackward: \n";
    displayBackward(end, prev);

    return 0;
}

しかし、コンパイルすると、このようなエラーが発生します

1>------ Build started: Project: xor_list, Configuration: Debug Win32 ------
1>  xor_list.cpp
1>c:\users\daviti\documents\visual studio 2010\projects\xor_list\xor_list\xor_list.cpp(30): error C2872: 'end' : ambiguous symbol
1>          could be 'c:\users\daviti\documents\visual studio 2010\projects\xor_list\xor_list\xor_list.cpp(9) : node *end'
1>          or       'end'
1>c:\users\daviti\documents\visual studio 2010\projects\xor_list\xor_list\xor_list.cpp(69): error C2872: 'end' : ambiguous symbol
1>          could be 'c:\users\daviti\documents\visual studio 2010\projects\xor_list\xor_list\xor_list.cpp(9) : node *end'
1>          or       'end'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

あいまいなシンボルの終わりはなぜですか?このエラーはどういう意味ですか?

4

4 に答える 4

5

コンパイラは、endグローバル変数を使用するかstd::endシンボルを使用するかを判断できません。これはたまたまコンテナーの末尾に反復子を返す関数です。そのシンボルに何かを割り当ててもあまり意味がないということは、別の問題です。using namespace std;この特定の問題を修正するには、ディレクティブを削除してください。using std::cout;名前空間の汚染を避けるために、これを に置き換えることをお勧めします。

于 2012-04-03T08:10:06.217 に答える
1

使用する場合は、あいまいさを取り除くために変数名を変更する必要があります

using namespace std;

std::endまたは、を含めず に終了を宣言する必要がありますusing namespace std;

于 2012-04-03T08:24:02.613 に答える
1

endプロジェクトで呼び出された別のシンボルがあるようです。シンボルの名前を変更する必要があります。

endまたは、キーワードとして定義する拡張機能またはプラグインがあるかもしれません。

于 2012-04-03T07:59:19.620 に答える
1

これは、単一の XOR されたポインターを使用した二重 LL の実装です。コメントをお寄せください。ありがとう!

#include <stdio.h>
#include <stdlib.h>

static struct node *nodeAlloc();
static struct node *xor(struct node *a, struct node *b);
static void insertFirst(int);
static void insertLast(int);
void dumpList(struct node *, struct node *);

struct node {
    int value;
    struct node *np;
};

struct node *head;
struct node *tail;

static struct node *nodeAlloc() {
    return (struct node *)malloc(sizeof(struct node));
}

static struct node *xor(struct node *prev, struct node *next) {
    return (struct node*)((unsigned long)prev ^ (unsigned long)next);
}

static void insertFirst(int value) {
    struct node *x;
    x = nodeAlloc();
    x->value = value;

    if(head == NULL && tail == NULL) {
        x->np = NULL;
        head = x;
        tail = x;
    } else {
        x->np = xor(NULL, head);
        head->np = xor(x, head->np);

        head = x;                
    }
}

static void insertLast(int value) {
    struct node *x;
    x = nodeAlloc();
    x->value = value;

    if(head == NULL && tail == NULL) {
        x->np = NULL;
        head = x;
        tail = x;
    } else {
        x->np = xor(tail, NULL);
        tail->np = xor(tail->np, x);

        tail = x;
    }
}

void dumpList(struct node *node, struct node *prev) {
    if(node != NULL) {
        printf("\n%d", node->value);
        dumpList(xor(node->np, prev), node);
    }
}


//------------------

int main() {
    insertFirst(7);
    insertFirst(5);
    insertFirst(4);
    insertFirst(2);
    insertLast(8);
    insertLast(9);
    insertLast(10);


    printf("\n------------------\nForward List:");

    dumpList(head, NULL);

    printf("\n------------------\nBackward List:");

    dumpList(tail, NULL);   

    return 0;
}
于 2012-04-23T01:36:33.123 に答える