[每日练习]如何使用一个指针来实现双向链表操作
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;
}
#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;
}
相关文章推荐
- 如何使用一个指针来实现双向链表操作
- 一天练习一个小C/C++程序(二) 指针到底该如何使用
- 如何使用触发器实现数据库级守护,防止DDL操作
- Joomla!中如何使用switcher.js实现一个位置上div层的切换显示 【转】
- 每日一题:编写一个函数,不使用算术运算符,实现比较两个数的大小
- Linux系统中,有两个文件file1和file2,每个文件的每一行都是#UUID,其中的每一UUID表示一个号。要找出在file1中有而在file2中没有的UUID,使用cat,sort,uniq三个命令如何实现
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
- 如何实现一个带引用记数的智能指针模板
- 约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
- 如何使用c语言实现双向链表的插入删除操作
- javascript操作两个选择列表(有两个列表,如何实现在一个列表通过双击和多选列表中内容添加到另一个列表. )
- 【题目5】如何使用两个栈来实现一个队列
- 使用 this 指针和 prototype 实现 js 的 OO 时的一个区别
- 如何实现使得一个普通用户以root身份运行命令和如何使用sudo命令?
- 市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加
- 如何使用针式PKM实现小组共享同一个知识库?
- MF中使用GPRS:如何通过一个串口终端实现GPRS Modem拨号上网
- 约瑟夫环问题的 PHP 实现--使用 PHP 数组内部指针操作函数
- 使用jquery 如何编写实现请求本页面的无刷新操作