数据结构4.双向链表复制

江枫思渺然 提交于 2020-02-05 06:08:05

在这里插入图片描述
设一带头结点的双向循环链表表示的线性表:L =(a1, a2, …… , an)
请写出一个时间复杂度为O(n)的算法,将L改造为:L =(a1, a2, ……, an-1, an, an-1, ……, a2, a1)

测试输入:
1 2 3 4 5 -1

测试输出:
Link next:5,4,3,2,1,
Link prior:1,2,3,4,5,
NewL next:5,4,3,2,1,2,3,4,5,
NewL prior:5,4,3,2,1,2,3,4,5,

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct DuLNode
{
    ElemType data;         // 数据域
    struct DuLNode *prior; // 指向前驱的指针域
    struct DuLNode *next;  // 指向后继的指针域
} DuLNode, *DuLinkList;

// 函数原型
void out_next(DuLinkList);
void out_prior(DuLinkList);
void rcopy(DuLinkList); //这是你要编写的函数

// 函数定义
void out_next(DuLinkList DHead)
{
    DuLinkList p = DHead->next;
    while (p != DHead)
    {
        printf("%d,", p->data);
        p = p->next;
    }
    printf("\n");
}

void out_prior(DuLinkList DHead)
{
    DuLinkList p = DHead->prior;
    while (p != DHead)
    {
        printf("%d,", p->data);
        p = p->prior;
    }
    printf("\n");
}

int main()
{
    DuLinkList DHead, p;
    int num;

    DHead = (DuLNode *)malloc(sizeof(DuLNode));
    DHead->data = -1;
    DHead->prior = DHead->next = DHead; // 生成表头

    scanf("%d", &num);
    while (num != -1)
    {
        p = (DuLNode *)malloc(sizeof(DuLNode));
        p->data = num;
        p->next = DHead->next; // 1.链接p的next链
        DHead->next = p;       // 2.链接DHead的next链
        p->next->prior = p;    // 3.链接p的next的prior链
        p->prior = DHead;      // 4.链接p的prior链
        scanf("%d", &num);
    }
    printf("Link  next:");
    out_next(DHead);
    printf("Link prior:");
    out_prior(DHead);
    rcopy(DHead);
    printf("NewL  next:");
    out_next(DHead);
    printf("NewL prior:");
    out_prior(DHead);
    return 0;
}

void rcopy(DuLinkList DHead)
{
    DuLinkList r = DHead->next, s = DHead->next, t;
    while (r->next != DHead)
    {
        r = r->next;
        s = s->next;
    }
    while (r->prior != DHead)
    {
        r = r->prior;
        t = (DuLinkList)malloc(sizeof(DuLNode));
        t->data = r->data;
        t->next = s->next;
        s->next = t;
        t->prior = s;
        s = s->next;
        DHead->prior = t;
    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!