链表双指针删除节点c语言,设有一个循环双链表,其中有一个结点的指针为P,编写程序 删除P左边的结点,并将P与其右边的一个结点交...

满意答案

C++的STL的list就是双向链表,java的LinkedList也是一个双向链表,删除,换位都是很简单的事情,但是他们的节点都是得不到的,因为用户只需要关心数据,而不需要关心节点怎么实现

下面是C写的,一开始的循环内容是数字1到8,然后对1所在节点操作,于是完成后1左边的8被删除了,1和右边的2对换。截图在最下面。。很小的一个图片~

=================================================

#include

#include

typedef struct _node {

int value;

struct _node *left;

struct _node *right;

} node;

void hook(node *anode, node *left, node *right) {

anode->left = left;

anode->right = right;

left->right = anode;

right->left = anode;

}

node * unhook(node *anode) {

if (anode->left == anode) {

free(anode);

return 0;

}

node *ret = anode->right;

anode->left->right = anode->right;

anode->right->left = anode->left;

free(anode);

return ret;

}

node * make_node(int value) {

node *new_node = (node *) malloc(sizeof(node));

new_node->value = value;

return new_node;

}

node * make_single_node(int value) {

node *new_node = make_node(value);

hook(new_node, new_node, new_node);

return new_node;

}

node * make_middle_node(int value, node *left, node *right) {

node *new_node = make_node(value);

hook(new_node, left, right);

return new_node;

}

node * create_double_linked_circle(int *start, int *last) {

node *head = make_single_node(*start);

node *left = head, *right = head;

while (++start != last) {

left = make_middle_node(*start, left, right);

}

return head;

}

void swap(node *x, node *y) {

if (x != y) {

int temp = x->value;

x->value = y->value;

y->value = temp;

}

}

node * process(node *anode) {

if (!anode) return 0;

if (anode->right == anode) {

free(anode);

return 0;

}

swap(anode, anode->right);

unhook(anode->left);

return anode;

}

void print_circle(node *head) {

if (!head) return;

node *cur = head;

do {

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

cur = cur->right;

} while (cur != head);

printf("\

");

}

void free_circle(node *head) {

while (head) {

head = unhook(head);

}

}

int main() {

int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, };

node *head = create_double_linked_circle(array, array+8);

print_circle(head);

head = process(head);

print_circle(head);

free_circle(head);

return 0;

}

00分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值