xor linked list implementation

1.8k views Asked by At

here is my code for xor linked list implementation

#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;
}

but when i compile it,it gives me error like this

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

why it is ambigious symbol end?what does this error mean?

4

There are 4 answers

0
irobot On BEST ANSWER

The compiler is unsure whether to use your end global variable or the std::end symbol, which happens to be a function returning an iterator to the end of a container. That it doesn't make much sense to assign anything to that symbol is a different matter. Remove the using namespace std; directive to fix this particular problem. I would suggest replacing it with using std::cout; to avoid polluting the namespace.

0
Luchian Grigore On

There appears to be another symbol called end in your project. You have to rename the symbol.

Or maybe you have an extension or plugin that defines end as a keyword.

0
IndieProgrammer On

Either you have to change your variable name to remove ambiguity ,when you use

using namespace std;

or You have to declare your end as std::end without including using namespace std;.

0
sumitgupta On

Here is my implementation of Doubly LL using single XOR'ed pointer. Please throw in your comments. Thanks!

#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;
}