将双向循环链表L=(a1,a2,...,an)改造成L=(a1,a3,...,an,...,a4,a2)
2014-04-25 22:58
351 查看
设以带头结点的双向循环链表表示的线性表L=(a1,a2,...,an)。试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3,...,an,...,a4,a2)。
双向循环链表类型定义如下:
实现函数如下:
双向循环链表类型定义如下:
typedef struct BiNode { ElemType data; int freq; struct BiNode *prev, *next; } BiNode, *BiLinkList;
实现函数如下:
void ReverseEven(BiLinkList &L) { BiLinkList p,q,s,r; int i = 0; q = L; p = L; p = p -> next; r = p; while(p -> next != L){ s = p -> next; i++; /**i值表示当前p指针的指向**/ if(i%2 == 0){ /**将第偶数个指针移到头指针左边**/ q -> prev = p; p -> next = q; q = q -> prev; p = s; /**记录p点**/ r -> next = s; /**将s指针指向的节点与修改后的前一节点相连接**/ s -> prev = r; r = r -> next; } else /**不符合条件,p指针往后移**/ p = p -> next; } p -> next = q; q -> prev = p; }
相关文章推荐
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- 探讨C语言的那些小秘密之断言
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- 基于C语言fflush()函数的使用详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy
- 探讨register关键字在c语言和c++中的差异
- C中实现矩阵乘法的一种高效的方法
- c语言printf函数的使用详解
- C语言学籍管理系统源代码
- 浅析C语言中的sizeof
- c语言内存泄露示例解析
- 浅析C语言位域和位段
- 解析C语言中位字段内存分配的问题
- 学生成绩管理系统C语言代码实现
- 基于C语言sprintf函数的深入理解