设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
2017-03-27 23:05
1776 查看
#include<stdio.h> typedef int ElemType; typedef struct DuLNode{ ElemType data; struct DuLNode *prior; struct DuLNode *next; } DuLNode, *DuLinkList; DuLinkList InitDuLinkList();//初始化双向循环链表(头节点) void CreateDuLinkList(DuLinkList L, ElemType *arr, int n);//创建链表元素 void ShowList(DuLinkList L);//输出链表 /* 将L中的元素,按如下规则插入新表,并返回新表。 (1,2)->(1,3,2)->(1,3,4,2)->(1,3,5,4,2)->(1,3,5,6,4,2)->... */ DuLinkList Transform(DuLinkList L); int main() { ElemType data[7] = { 1, 2, 3, 4, 5, 6, 7 };//测试数据1(奇数个) //ElemType data[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };//测试数据2(偶数个) int length = sizeof(data) / sizeof(ElemType); DuLinkList L = InitDuLinkList(), Lnew; CreateDuLinkList(L, data, length); printf("原链表:"); ShowList(L); Lnew = Transform(L); printf("改造表:"); ShowList(Lnew); getchar(); return 0; } DuLinkList InitDuLinkList() { DuLNode *dnode = (DuLNode *)malloc(sizeof(DuLNode)); dnode->data = 0; dnode->prior = dnode; dnode->next = dnode; return dnode; } void CreateDuLinkList(DuLinkList L, ElemType *arr, int n) { DuLNode *dnode; DuLNode *p = L; int i; for (i = 0; i < n; i++) { dnode = (DuLNode *)malloc(sizeof(DuLNode)); dnode->data = arr[i]; dnode->next = L; dnode->prior = p; p->next = dnode; p = p->next; } } void ShowList(DuLinkList L) { int i; DuLNode *r = L->next; while (r->next != L){ printf("%d ", r->data); r = r->next; } printf("%d ", r->data); printf("\n"); } DuLinkList Transform(DuLinkList L) { DuLinkList Lnew = InitDuLinkList(); DuLNode *p, *q, *pa, *pb; q = p = L->next; pa = pb = Lnew; while (p != L) { if (p != L) { /*L中寄数个数据插入Lnew*/ q = p->next;//保留 L 链表 //pa之后插入p p->prior = pa; pa->next = p; p->next = pb; pb->prior = p; pa = pa->next; p = q;//p指向 待操作 L } if (p != L) { /*L中偶数个数据插入Lnew*/ q = p->next;//保留 L 链表 //pb之前插入p p->next = pb; pb->prior = p; p->prior = pa; pa->next = p; pb = pb->prior; p = q;//p指向 待操作 L } } return Lnew; }
相关文章推荐
- 设以带头结点的双向循环链表表示的线性表L=(a1,a2,……,an)。
- 将双向循环链表L=(a1,a2,...,an)改造成L=(a1,a3,...,an,...,a4,a2)
- 设双链表表示的线性表L=(a1,a2,a3.....an)将L改造为L=(a1,a3,....an...a4,a2)
- 有一个带头结点的单链表L={a1,b1,a2,b2,...,an,bn},设计一个算法将其拆分成两个带头结点的单链表A和B,正序链表A={a1,a2,a3...,an},逆序链表B={bn,bn-1,
- 面试-链表逆置 作业手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低
- 假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的入队和出队的算法
- 带头结点的循环链表表示队列的初始化、入队列和出队列的算法
- 编写算法实现建立一个带头结点的含n个元素的双向循环链表H,并在链表H中的第i个位置插入一个元素e
- 判断带头结点的双向循环链表L是否对称相等的算法
- 假设以带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点(注意不设头指针) 试编写相应的队列初始化,入队列和出队列的算法
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 数组元素交叉排列的算法题(a1 a2 a3 .. an b1 b2 b3 .. bn -->a 1 b1, a2 b2, a3 b3, .. an bn )
- 给一个数组[a1,a2,a3....an],要求出令ai-aj有最大值,其中i<=j,时间和空间复杂度尽可能小
- 数据结构习题分析:已知由一个线性链表表示的线性表中含有三类字符的数据元素,是编写算法将该线性表分割为三个循环链表,其中每个。。。。。
- 数据结构题集(严蔚敏)2.37 改造带头结点的双循环链表
- 双向循环链表的建立,插入,删除(不带头结点)
- 线性表学习归纳总结五:不带头结点的循环链表
- 带头结点的双向循环链表
- 给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。
- C++模板实现双向循环链表(有带头结点)