中易网

数据结构 设有一个循环双链表,其中有一个结点的指针为p,编写一个算法将p与其后续结点进行交换。

答案:2  悬赏:80  
解决时间 2021-03-14 02:04
数据结构 设有一个循环双链表,其中有一个结点的指针为p,编写一个算法将p与其后续结点进行交换。
最佳答案
先添加;后删除!

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;
全部回答
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; }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
好姐妹分离送什么礼物呢?
没有芯片的智能手机能用吗?有什么影响
陌上花开摄影会馆润达店地址在哪,我要去那里
2017年高考模拟录取什么时候
一个两位数精确到十分位是7.0,那么这个两位
电脑配置很高,但是玩LOL后半局会很卡,画面
新买的dell的机子 分区把系统删了 能恢复吗
物业公司的水电工和综合维修工负责的工作有区
大众点评网怎样注册
我女朋友昨天合我分手了,但是她衣服都在我家
文天祥面对死亡的威胁没有恐惧也没有
德德哋粥粉面在哪里啊,我有事要去这个地方
衣袖上的扣环怎么穿啊 衣袖上有两个挨着的半
我买的高尔夫7,怎么看买的是不是旗舰版 感觉
你好,你做过从杏林汽车站到东莞的的汽车,请
推荐资讯
怎样用EXCEL算工人计件工资
国际会议口译员协会(AIIC)会员的年薪一般是
义乌小商品的质量怎么样?
借记卡能用于网购吗
戏剧的英文是什么
吃红豆薏米粥可以吃粽子吗?
中国建设银行网上银行有营业时间限制吗
古人的字和号各是什么意思
为啥下班后喝一瓶啤酒特别困 但多喝点又精神
flicka 衣服是什么牌子??
求一部真人的动画片,讲的是一个男的进入了电
爱情氧吧美甲沙龙旗舰店地址有知道的么?有点
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?