算法导论 10-2-8 个指针实现双链表

来源:互联网 发布:矩阵切换系统 编辑:程序博客网 时间:2024/06/16 10:04

题目:利用一个指针实现双链表。每一个节点里面存一个np,x.np = x.pre XOR x.next

思路: a XOR a = 0; 0 XOR a = a; 因此,np与父节点进行xor运算之后,就能得到next的地址。


#include <iostream>using namespace std;struct LinkList{    int key;    int prenext;};struct LinkList* insertLinkList(struct LinkList*head,int d,struct LinkList**tail);struct LinkList* searchLinkList(struct LinkList*head,int d);struct LinkList* deleteLinkList(struct LinkList*head,int d);void print(struct LinkList* head);int main (){    struct LinkList*head = 0;    struct LinkList*tail = 0;    for (int i = 0;i < 12;i ++)    {        head = insertLinkList(head,i,&tail);        //cout << tail->key;    }    print(head);    print(tail);    struct LinkList* tr = searchLinkList(head,12);    if (tr)    {        cout << tr-> key << endl;    }}struct LinkList* insertLinkList(struct LinkList*head,int d,struct LinkList**tail){    struct LinkList * tmp = new struct LinkList();    tmp->key = d;    tmp->prenext = 0;    if (NULL == head)    {        head = tmp;        head->prenext = 0;        *tail = tmp;        return head;    }    if ( 0 == head->prenext)    {        head->prenext = (int)tmp;        tmp->prenext = tmp->prenext^((int)head);        *tail = tmp;        return head;    }    struct LinkList * p = head;    struct LinkList * q = (struct LinkList *)head->prenext;    struct LinkList * r = NULL;    struct LinkList * s = NULL;    while (q != 0)    {        r = q;        s = p;        q = (struct LinkList*)(q->prenext^((int)p));        p = r;        r = s;    }    p->prenext = ((int)tmp)^((int)r);    tmp->prenext = ((int)p);    *tail = tmp;    return head;}void print(struct LinkList* head){    if (NULL == head)    {        return ;    }    struct LinkList * p = head;    cout << p->key << ' ';    struct LinkList * q = (struct LinkList *)head->prenext;    if (NULL == q)    {        return;    }    struct LinkList * r = NULL;    struct LinkList * s = NULL;    while (q != NULL)    {        r = (struct LinkList *)(q->prenext^((int)p));        cout << q->key << ' ';        p = q;        q = r;    }    cout << endl;}struct LinkList* searchLinkList(struct LinkList*head,int d){    if (NULL == head)    {        return 0;    }    struct LinkList * p = head;    if (p->key == d)    {        return p;    }   // cout << p->key << ' ';    struct LinkList * q = (struct LinkList *)head->prenext;    if (NULL == q)    {        return 0;    }    struct LinkList * r = NULL;    struct LinkList * s = NULL;    while (q != NULL)    {        r = (struct LinkList *)(q->prenext^((int)p));       if (q->key == d)       {           s = q;           break;       }        //cout << q->key << ' ';        p = q;        q = r;    }    return s;  //  cout << endl;}struct LinkList* deleteLinkList(struct LinkList*head,int d){}

0 0
原创粉丝点击