双向循环链表中结点的交换
描述
利用双向循环链表表示一个整数序列,指定一个结点位置用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; }

浙公网安备 33010602011771号