[Clone Linked List со следующим и случайным указателем] [Runtime Error] - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь ответить на этот вопрос с помощью хеширования.https://practice.geeksforgeeks.org/problems/clone-a-linked-list-with-next-and-random-pointer/1

Мне нужно только реализовать эту функцию.

Вот мой код.

struct Hash
{
    struct Node*orig;
    struct Node*copy;
};
 struct Hash H[10005];
void put(Node*k,Node*v)
{
    int idx=k->data;
    H[idx].orig=k;
    H[idx].copy=v;
}
Node* get(Node *k)
{
    int idx=k->data;
    return(H[idx].copy);
}
Node*getnode(int v)
{
    Node*newnode=NULL;
    newnode=(Node*)malloc(sizeof(Node));
    newnode->data=v;
    newnode->next=NULL;
    newnode->arb=NULL;
    return newnode;
}
void init_hash()
{
    for(int i=0;i<10005;i++)
    {
        H[i].orig=NULL;
        H[i].copy=NULL;
    }
}
Node * copyList(Node *head)
{
     // Your code her
     Node*curr=head;
     Node*headcopy=NULL;
     Node*tailcopy=NULL;
     init_hash();
     while(curr)
     {
         Node * newnode=getnode(curr->data);    
         if(headcopy==NULL)
         headcopy=newnode;
         put(curr,newnode);
         curr=curr->next;
     }

     curr=head;
     while(curr)
     {
         Node*copycurr=get(curr);
         //if(copycurr!=NULL)
        // copycurr->next=(struct Node*)malloc(sizeof(struct Node));
         copycurr->next=get(curr->next);
         //if(copycurr!=NULL)
         //copycurr->arb=(struct Node*)malloc(sizeof(struct Node));
         copycurr->arb=get(curr->arb);
         curr=curr->next;
     }
    return headcopy;
}

Выдает ошибку RunTime.Я могу думать о причине.Я инициализирую next и random как Null, а затем делаю

copycurr->next=get(curr->next);
copycurr->arb=get(curr->arb);

Если я закомментирую эти строки, прогоны программы, конечно, неправильный вывод.

Я также попытался закомментировать инициализацию next и random как NULLно все та же ошибка.Может кто-нибудь, пожалуйста, предложите, какую ошибку я делаю.Я хочу решить, используя мой собственный хэш.

Edit1: добавление полного кода в соответствии с комментариями:

        #include <bits/stdc++.h>
        using namespace std;
        struct Node
        {
        int data;
        Node* next;
        Node* arb;
        };
        Node *newNode(int data)
        {
            Node *new_node = new Node;
            new_node->data = data;
            new_node->next = NULL;
            new_node->arb=NULL;
            return new_node;
        }
        void print(Node *root)
        {
        Node *temp = root;
        while(temp!=NULL )
        {
        int k;
        if(temp->arb==NULL)k=-1;
        else k=temp->arb->data;
        cout<<temp->data<<" "<<k<<" ";
        temp=temp->next;
        }
        }
        //Node * copyList(Node *head);
        void append( Node** head_ref, Node **tail_ref, int new_data)
        {
            Node* new_node = new Node;
            new_node->data  = new_data;
            new_node->next = NULL;
            new_node->arb=NULL;
            if (*head_ref == NULL){
               *head_ref = new_node;
            }
            else
               (*tail_ref)->next = new_node;
            *tail_ref = new_node;
        }
        bool validation(Node *head,Node * res,Node *cloned_addr,Node *generated_addr)
        {
            if(generated_addr==cloned_addr)
                return false;
            Node* temp1 = head;
            Node *temp2 = res;
            int len1=0,len2=0;
            while(temp1!=NULL)
            {
                len1++;
                temp1=temp1->next;
            }
            while(temp2!=NULL)
            {
                len2++;
                temp2 = temp2->next;
            }
            /*if lengths not equal */
            if(len1!=len2)
            return false;
            temp1= head;
            temp2=res;
            while(temp1!=NULL)
            {
                if(temp1->data!=temp2->data)
                return false;
                if(temp1->arb!=NULL and temp2->arb!=NULL)
                {
                    if(temp1->arb->data!=temp2->arb->data)
                    return false;
                }else if(temp1->arb!=NULL and temp2->arb==NULL)
                    return false;
                temp1= temp1->next;
                temp2=temp2->next;
            }
            return true;
        }

        struct Hash
            {
                struct Node*orig;
                struct Node*copy;
            };
             struct Hash H[10005];
            void put(Node*k,Node*v)
            {
                int idx=k->data;
                H[idx].orig=k;
                H[idx].copy=v;
            }
            Node* get(Node *k)
            {
                int idx=k->data;
                return(H[idx].copy);
            }
            Node*getnode(int v)
            {
                Node*newnode=NULL;
                newnode=(Node*)malloc(sizeof(Node));
                newnode->data=v;
                newnode->next=NULL;
                newnode->arb=NULL;
                return newnode;
            }
            void init_hash()
            {
                for(int i=0;i<10005;i++)
                {
                    H[i].orig=NULL;
                    H[i].copy=NULL;
                }
            }
            Node * copyList(Node *head)
            {
                 // Your code her
                 Node*curr=head;
                 Node*headcopy=NULL;
                 Node*tailcopy=NULL;
                 init_hash();
                 while(curr)
                 {
                     Node * newnode=getnode(curr->data);    
                     if(headcopy==NULL)
                     headcopy=newnode;
                     put(curr,newnode);
                     curr=curr->next;
                 }

                 curr=head;
                 while(curr)
                 {
                     Node*copycurr=get(curr);
                     //if(copycurr!=NULL)
                    // copycurr->next=(struct Node*)malloc(sizeof(struct Node));
                     copycurr->next=get(curr->next);
                     //if(copycurr!=NULL)
                     //copycurr->arb=(struct Node*)malloc(sizeof(struct Node));
                     copycurr->arb=get(curr->arb);
                     curr=curr->next;
                 }
                return headcopy;
            }
        /* Driver program to test above function*/
        int main()
        {
          int T,i,n,l,k;
          Node* generated_addr=NULL;
        /*reading input stuff*/
            cin>>T;
            while(T--){
            generated_addr=NULL;
            struct Node *head = NULL,  *tail = NULL;
                cin>>n>>k;
                for(i=1;i<=n;i++)
                {
                    cin>>l;
                    append(&head, &tail, l);
                }
               for(int i=0;i<k;i++){
               int a,b;
               cin>>a>>b;
               Node *tempA=head;
               int count=-1;
               while(tempA!=NULL)
               {
                   count++;
                   if(count==a-1)
                    break;
                   tempA=tempA->next;
               }
               Node *tempB = head;
               count=-1;
               while(tempB!=NULL)
               {
                   count++;
                   if(count==b-1)
                    break;
                   tempB=tempB->next;
               }
               //when both a is greater than N
               if(a<=n)
               tempA->arb = tempB;
               }
        /*read finished*/
               generated_addr=head;
               Node *res = copyList(head);
               Node *cloned_addr = res;
               cout<<validation(head,res,cloned_addr,generated_addr)<<endl;
               }
            return 0;
        }
...