使用一个指针实现双向链表

来源:互联网 发布:海城市教育局网通知 编辑:程序博客网 时间:2024/06/11 01:17

算法导论10.2-8 假设所有指针的值都可视为K位的整型数,且定义 x.np = x.next ^ x.prev  。注意要说明获取表头所需信息,并说明如何在该表上实现SEARCH,INSERT,DELETE操作。

对^操作,有 x^y^y=x。

表头 head.np = head.prev ^ head.next = NULL ^ head.next. 所以head.np 指向第二个元素。

SEARCH操作:   //先比较前2个元素,再从第三个开始循环

if(head.value == x) return head;

if(head.np.value == x) return head.np;

node = head.np;//指向第二个

node_p = head;//指向第一个

while(node_next = node.np  ^ node_p)   // node.np = node_next ^ node_p  求第三个元素

if(node_next.value == x)

return node_next;

else{

node_p = node;

node = node_next;

}

}

return NULL;

INSERT操作: 

双指针链表的操作是:

node.next = head.next;

head.next.prev = node;

node.prev = head;

head.next = node;

根据双指针来写单指针操作://插入就是修改自身指针,再修改前后节点指针   第一个是自身指针  第二个是后节点指针 第三个是前节点指针

node.np = head ^ head.np    // node.np = node.next ^ node.prev = head.next ^ head = head .np ^ head

head.np.np = node ^( head ^ head.np.np)// head.next.np = head.next.next ^head.next.prev = head.np.next ^ head

// head.np.next = head.np.np ^head.np.prev = head.np.np ^ node 

head.np = node;

DELETE操作: 要知道node的前或者后节点 node_n = node.next   node_p = node.prev   下面已知前节点  删除就是修改前后节点的指针

node_n = node.np ^ node_p;  //求出向后的指针

node_p.np = node_n ^ node_p.np ^ node ;  // node_p.np = node_p.next ^ node_p.prev = (node_n ) ^ (node_p.np ^ node_p.next)  //注意这里只改变node_p.next 的值  node_p.prev内的不改 还维持node

node_n.np =  node_p ^  node_n.np ^ node; // node_n.np = node_n.prev ^ node_n.next =  node_p ^ (node_n.np ^ node_n.prev)free(node); // 同上





0 0
原创粉丝点击