双向循环链表中结点的交换

描述

 

利用双向循环链表表示一个整数序列,指定一个结点位置用p指向该结点,交换p所指向的结点及其前驱结点的顺序。

 

输入

多组数据,每组数据有三行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔),第三行为p所指向的结点位置。当n=0时输入结束。

输出

对于每组数据分别输出一行,依次输出交换结点顺序后的链表元素,元素之间用空格分隔。

输入样例 1 

5
44 11 22 33 55
3
6
22 33 11 66 44 55
6
0

输出样例 1

44 22 11 33 55
22 33 11 66 55 44


#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
#include<math.h>
#define MAXSIZE 1000
#define OVERFLOW -2
#define OK 1
#define ERROR 0

typedef struct DuLNode{
    int num;
    struct DuLNode *prior;
    struct DuLNode *next;
}DuLNode,* DuLinkList;

void Inist_List(DuLinkList& L){
    L=new DuLNode;
    L->next=NULL;
    L->prior=NULL;
}

void change(DuLinkList p)
{//pÊÇË«ÏòÑ­»·Á´±íÖеÄÒ»¸ö½áµã£¬½«pËùÖ¸½áµãÓëÆäǰÇý½áµã½»»»
    DuLinkList q;
    q = p->prior;
    q->prior->next = p;        //pµÄǰÇýµÄǰÇýÖ®ºó¼ÌΪp
    p->prior = q->prior;        //pµÄǰÇýÖ¸ÏòÆäǰÇýµÄǰÇý¡£
    q->next = p->next;        //pµÄǰÇýµÄºó¼ÌΪpµÄºó¼Ì¡£
    q->prior = p;                //pÓëÆäǰÇý½»»»
    p->next->prior = q;        //pµÄºó¼ÌµÄǰÇýÖ¸ÏòÔ­pµÄǰÇý
    p->next = q;            //pµÄºó¼ÌÖ¸ÏòÆäÔ­À´µÄǰÇý
}

void Zuhe(DuLinkList& L){
    DuLinkList H1=L;
    L->next=L;
    L->prior=L;
    int m;

    while(1){
        scanf("%d",&m);
        if(m==0)
            break;
        for(int i=0;i<m;i++){
            DuLinkList p= new DuLNode;
            scanf("%d",&p->num);
            p->next=L->next;
            L->next->prior=p;
            L->next=p;
            p->prior=L;
            L=p;
        }
        L=H1;
        DuLinkList q=L;
        int k;
        scanf("%d",& k);
        for(int i=0;i<k;i++)
            q=q->next;
        change(q);
        DuLinkList b=L;
        m--;
        while(m--)
        {
            b=b->next;
            printf("%d ",b->num);
        }
        printf("%d\n",b->next->num);
    }
}

int main(){
    DuLinkList L1;
    Inist_List(L1);
    Zuhe(L1);
    return 0;
}

 

posted @ 2020-10-15 17:20  奕玑  阅读(466)  评论(0)    收藏  举报