【数据结构】链表的应用-判断带头结点的循环双向链表是否对称

例题2-12:请设计算法,判断带头结点的循环双向链表是否对称

核心代码:

bool Symmetry(CDLinkList L){
    CDLinkList p=L->next,q=L->pre;
    while(p!=q&&q->next!=p){       //链表个数为: 奇数 和偶数 同时讨论
        if(p->data==q->data){
            p=p->next;
            q=q->pre;
        }else{
            return false*puts("该链表不对称");
        }
    }return true*puts("该链表对称");
}

调试代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define LElemType int
#define inf 0x3f3f3f3f
using namespace std;
typedef struct CDLNode{
    LElemType data;
    struct CDLNode * pre;
    struct CDLNode * next;
    CDLNode(LElemType Data=0,struct CDLNode* Pre=NULL,struct CDLNode* Next=NULL){
        data=Data;  pre=Pre;    next=Next;
    }
}CDLNode,*CDLinkList;
void InitCDLinkList(CDLinkList &L){
    L=new CDLNode(inf,NULL,NULL);
    L->next=L->pre;
    L->pre=L->next;
}

void CreateLinkList_Tail(CDLinkList &L,int n=0){ //尾插法
    InitCDLinkList(L);
    CDLinkList p=L,Pre=L;
    Pre=L;
    LElemType Data;
    for(int i=1;i<=n;i++){
        printf("请输入第%d个data值:\n",i);
        cin>>Data;
        p=new CDLNode(Data,Pre,L);
        Pre->next=p;
        Pre=p;
    }
    L->pre=Pre;
}

void CreateLinkList_Head(CDLinkList &L,int n=0){ //头插法
    InitCDLinkList(L);
    CDLinkList p=L,Pre=L,s;
    LElemType Data;
    for(int i=1;i<=n;i++){
        printf("请输入第%d个data值:\n",i);
        cin>>Data;
        p=new CDLNode(Data,L,L->next);
        s=L->next;
        if(i==1){
            L->pre=p;
            p->next=L;
        }
        if(s){
            s->pre=p;
        }
        L->next=p;
    }
}
void OutputCDLinkList(CDLinkList &L){
    CDLinkList p=L->next;
    printf("\n顺序输出:\n");
    while(p!=L){
        printf("%d%c",p->data,p->next==L?'\n':' ');
        p=p->next;
    }

    /*
    p=p->pre;
    printf("\n逆序输出:\n");
    while(p!=L){
        printf("%d\n",p->data);
        p=p->pre;
    }
    printf("\n");
    */
}
bool ListIsEmpty(CDLinkList &L){
    return L->pre==L->next?false:true;
}
int ListLength(CDLinkList &L){
    CDLinkList p=L->next;
    int Len=0;
    while(p!=L){
        Len++;
        p=p->next;
    }
    return Len;
}
void GetElem(CDLinkList &L,int i,LElemType &e){
    int j=1;
    CDLinkList p=L->next;
    while(p!=L&&j<i){
        j++;p=p->next;
    }
    if(p==L||j>i){
        printf("\" GetElem \" index %d error!!!\n",i);
        return ;
    }
    e=p->data;
}
int LocateElem(CDLinkList &L,LElemType e){
    int j=1;
    CDLinkList p=L->next;
    while(p!=L&&p->data!=e){
        p=p->next;
        j++;
    }
    if(p==L){
        printf("\"LocateElem\" not found %d\n",e);
        return -1;
    }
    return j;
}
void ListInsert(CDLinkList &L ,int i,LElemType e){
    int j=0;
    CDLinkList p=L,s;
    while(j<i-1&&p->next!=L){
        j++;p=p->next;
    }
    if((p==L||j>i-1)&&i!=1){
        printf("\"ListInsert\" index : %d error!!!\n",i);
    }else{
        s=new CDLNode(e,p,p->next);
        p->next->pre=s;
        p->next=s;
    }
}
void ListDelete(CDLinkList &L,int i,LElemType &e){
    int j=0;
    CDLinkList p=L,s;
    while(j<i-1&&p->next!=L){
        j++;p=p->next;
    }
    if((p==L||j>i-1)&&i!=1){
        printf("\"ListInsert\" index : %d error!!!\n",i);
    }else{
        s=p->next;
        p->next=s->next;
        s->next->pre=p;
        e=s->data;
        delete s;
    }
}
void Array_List(CDLinkList &L,int a[],int n){
    InitCDLinkList(L);
    CDLinkList p=L,Pre=L;
    Pre=L;
    LElemType Data;
    for(int i=0;i<n;i++){
        p=new CDLNode(a[i],Pre,L);
        Pre->next=p;
        Pre=p;
    }
    L->pre=Pre;
}
bool Symmetry(CDLinkList L){
    CDLinkList p=L->next,q=L->pre;
    while(p!=q&&q->next!=p){       //链表个数为: 奇数 和偶数 同时讨论
        if(p->data==q->data){
            p=p->next;
            q=q->pre;
        }else{
            return false*puts("该链表不对称");
        }
    }return true*puts("该链表对称");
}
int main()
{
    CDLinkList La;
    LElemType e,t;
    int a[]={1,2,3,4,5};
    Array_List(La,a,5);
    OutputCDLinkList(La);
    Symmetry(La);

    int b[]={1,2,1};
    Array_List(La,b,3);
    OutputCDLinkList(La);
    Symmetry(La);

    int c[]={2,2};
    Array_List(La,c,2);
    OutputCDLinkList(La);
    Symmetry(La);

}

猜你喜欢

转载自blog.csdn.net/Z_sea/article/details/85110285