zoukankan      html  css  js  c++  java
  • 双向链表的运用

    问题描述:

     假设在算法描述语言中引入指针的二元运算“异或”若ab为指针,则a异或b的运算结果仍为原指针类型,且

       A异或(a异或b=(a异或a)异或b=b;

       (A异或b)异或b=a异或(a异或b)=a;

    即可利用一个指针域来实现双向链表L。链表L中的每个结点只含两个域:data域和LRPtr域,其中LRPtr域存放该节点的左邻与右邻结点指针(不存在是为null)的异或。若设指针L.Left指向链表中的最左结点,L.Right指向链表中的最右结点,则可实现从左向右或从右向左遍历此双向链表的操作。试写一算法按任一方向依次输出链表中的各元素的值。

     

    问题分析:感觉有点回到高中时期,哪个时候,没做过的题,第一次看到都看不懂题目要问的意思,不知道它要我干什么,这是很槽糕的,通常在这样的情况下,也只有先看下答案,然后慢慢再理解一下题目的意思,这样弄懂了以后,下次碰到这样的题也就有了思路,现在又何尝不是这样呢?要弄懂是要花功夫的,过去的大学,你是怎么上的,你怎么能没有这些努力,好吧,回到正题,再想想,看书上已经给了一些提示了:

    异或指针双向链表类型和指针异或函数定义为:

    Typedef struct XorNode{

    Char data;

    Struct XorNode LRPtr;

    }XorNode,*XorPointer;

     

    Typedef struct {//无头结点的异或指针双向链表

    XorPointer  Left, Right;//分别指向链表的左端和右端

    } XorLinkedList;

     

    XorPointer XorP(XorPointer  p,XorPointer  q);//指针异或函数XorP返回指针pq的异或的值

    Status TraversingLinkList(XorLinkedList &L,char d)

    {

       XorPointer p,left,right;

       If(d==l||d==L)

       {

          P=L.left;

          Left=null;

          While(p!=null)

          {

             VisitingData(p->data);

              Left=p;

              P=XorP(left,p->LRPtr);

           }

       }

      Else

         If(d==R||d==r)

          {

             P=L.right;

             Right=null;

             While(p!=null)

             {

               VisitingData(p->data);

               Right=p;

               P=XorP(p->LRPtr, Right);

             }

          }

    }

    接着采用上述的存储结构,写出在第i个结点之前插入一个结点的算法,和删除第i个结点的算法。

     此两个算法书上都有提及,改装下

     

    先定位:

    返回的应该是地址,用指针保存,再这里函数返回的是指针类型的该怎样表示了,

    暂且按我的理解来吧

    Char *  GetElemP_Dul(XorLinkedList &L,int i)

    {

      Char *p;

      P=L->next;j=1;

      While(p&&j<i)

      {

       P=p->next;

       ++j;

      }

     If(!p||j>i)  return error;

    Return p;

    }

    插入的算法:

    Status ListInsert_Dul(XorLinkedList &L,int i,char d)

    {

     If(!(p=GetElemP_Dul(L,i)))

     Return error;

     If(!(s=(XorLinkedList)malloc(sizeof(XorNode)) ))  return error;

     S->data=d;

     S->prior=p->prior; p->prior->next=s;

     S->next=p;p->prior=s;

     Return ok;

    }

    删除的算法:

    Status ListDelete_Dul(XorLinkedList &L,int i)

    {

      If(!(p=GetElemP_Dul(L,i)))

       Return error;

      p->prior->next=p->next;

      P->next->prior=p->prior;

      Free(p);

      Return ok;

    }

  • 相关阅读:
    【原创】2013个人年终总结
    【原创】关于部门月会(二)
    【原创】关于部门月会(一)
    [转载]使用RoboCopy 命令
    ubuntu 16.04.3 安装完成后的一些初始化工作
    umbraco v7.6.4 surface controller not found 大深坑!
    ubuntu 及 postgredql 安装配置小坑摘录
    flex hack 记录
    C# 中的委托和事件
    OVER(PARTITION BY)函数介绍
  • 原文地址:https://www.cnblogs.com/wj204/p/3044263.html
Copyright © 2011-2022 走看看