2012-04-03 18 views
0

は、XORリンクリストの実装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; 
} 

のための私のコードですが、私はそれをコンパイルするとき、それはambigiousシンボル終わりである理由、それは何?私にこの

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 ========== 

のようなエラーが発生しますこのエラーはどういう意味ですか?

+0

'end'ノードの変数名を' finish'のように変更し、再コンパイルします。 – Jaywalker

答えて

5

グローバル変数endを使用するか、イテレータをコンテナの最後に返す関数であるかのようなstd::endシンボルをコンパイラは使用するかどうかは不明です。そのシンボルに何かを割り当てるのはあまり意味がないということは別の問題です。この特定の問題を解決するためにusing namespace std;指示文を削除してください。名前空間の汚染を避けるため、using std::cout;に置き換えることをお勧めします。あなたはあなたがusing namespace std;を含めずstd::endとして、あなたの終わりを宣言する必要が

using namespace std;

を使用する場合や、

1

プロジェクトにendという別のシンボルがあるようです。シンボルの名前を変更する必要があります。

また、endをキーワードとして定義した拡張機能やプラグインがあります。

1

は、どちらかは、曖昧さを取り除くために、あなたの変数名を変更する必要があります。

1

ここでは、単一XORのポインタを使用したDoubly 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; 
} 
関連する問題