数据结构 设有一个循环双链表,其中有一个结点的指针为p,编写一个算法将p与其后续结点进行交换。
答案:2 悬赏:80
解决时间 2021-03-14 02:04
- 提问者网友:霸道又专情♚
- 2021-03-13 14:15
数据结构 设有一个循环双链表,其中有一个结点的指针为p,编写一个算法将p与其后续结点进行交换。
最佳答案
- 二级知识专家网友:社会水太深
- 2021-03-13 15:36
先添加;后删除!
node *s;
s = (node*)malloc(sizeof(node));
s->data = p->data;
s->next = p->next->next;
s->next->pre = s;//右边插好
s->pre = p->next;
s->pre->next = s;//左边接好
p->pre->next = p->next;
p->next->pre = p->pre;
node *s;
s = (node*)malloc(sizeof(node));
s->data = p->data;
s->next = p->next->next;
s->next->pre = s;//右边插好
s->pre = p->next;
s->pre->next = s;//左边接好
p->pre->next = p->next;
p->next->pre = p->pre;
全部回答
- 1楼网友:都不是誰的誰
- 2021-03-13 16:55
c++的stl的list就是双向链表,java的linkedlist也是一个双向链表,删除,换位都是很简单的事情,但是他们的节点都是得不到的,因为用户只需要关心数据,而不需要关心节点怎么实现
下面是c写的,一开始的循环内容是数字1到8,然后对1所在节点操作,于是完成后1左边的8被删除了,1和右边的2对换。截图在最下面。。很小的一个图片~
=================================================
#include <stdio.h>
#include <stdlib.h>
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;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯