您的位置:首页 > 其它

[每日练习]如何使用一个指针来实现双向链表操作

2014-09-19 16:44 597 查看
#include <stdio.h>

#include <stdlib.h>

typedef struct _DoubleLinkList {

 size_t p;

 int value;

}DoubleLinkList;

#define NextNode(prev,curr) (DoubleLinkList *)((size_t)prev ^ curr->p)

#define PrevNode(curr,next) (DoubleLinkList *)((size_t)next ^ curr->p)

#define MakePointer(prev, next) ((size_t)prev ^ (size_t)next)

#define InsertFirst(head, value) Insert(head, head, value)

DoubleLinkList *Create()

{

 DoubleLinkList *head = malloc(sizeof(DoubleLinkList));

 if(head == NULL)

  return NULL;

 

 head->p = 0;

 head->value = 0;

 

 return head;

}

void Insert(DoubleLinkList *head, DoubleLinkList *node, int value)

{

 DoubleLinkList *newnode = malloc(sizeof(DoubleLinkList));

 newnode->value = value;

 if(head->p == 0)

 {

  newnode->p = MakePointer(head, 0);;

  head->p = MakePointer(0, newnode);

  return;

 }

 else if(head == node)

 {

  DoubleLinkList *firstnode = NextNode(0, head);

  DoubleLinkList *secondnode = NextNode(head, firstnode);

  head->p = MakePointer(0, newnode);;

  newnode->p = MakePointer(head, firstnode);

  firstnode->p = MakePointer(newnode, secondnode);

 }

 else

 {

  DoubleLinkList *prev = 0;

  DoubleLinkList *curr = head;

  DoubleLinkList *next, *next2;

  while((next = NextNode(prev, curr)) && next != node)

  {

   prev = curr;

   curr = next;

  }

  

  if(next == NULL)

  {

   free(newnode);

   return;

  }

   

  prev = curr;

  curr = next;

  next = NextNode(prev, curr);

  next2 = NextNode(curr, next);

  curr->p = MakePointer(prev, newnode);

  newnode->p = MakePointer(curr, next);

  next->p = MakePointer(newnode, next2);

 }

}

void Remove(DoubleLinkList *head, int value)

{

 if(head == NULL || head->p == 0)

 {

  return;

 }

 else

 {

  DoubleLinkList *prev = 0;

  DoubleLinkList *curr = head;

  DoubleLinkList *next, *next2, *next3;

  while((next = NextNode(prev, curr)) && next->value != value)

  {

   prev = curr;

   curr = next;

  }

  

  if(next == NULL)

  {

   return;

  }

  next2 = NextNode(curr, next);

  next3 = NextNode(next, next2);

  curr->p = MakePointer(prev, next2);

  next2->p = MakePointer(curr, next3);

  free(next);

 }

}

void Print(DoubleLinkList *head)

{

 if(head == NULL || head->p == 0)

 {

  return;

 }

 else

 {

  DoubleLinkList *prev = 0;

  DoubleLinkList *curr = head;

  DoubleLinkList *next;

  while(next = NextNode(prev, curr))

  {

   printf("%d, ", next->value);

   prev = curr;

   curr = next;

  }

  printf("\n");

 }

}

int main()

{

 DoubleLinkList *head = Create();

 int arr[] = {5,3,7,1,8,2,9};

 int i;

 

 for(i=0; i<sizeof(arr)/sizeof(int); i++)

  InsertFirst(head, arr[i]);

  

 Print(head);

 

 Remove(head, 7);

 Remove(head, 2);

 

 Print(head);

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐