例题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);
}