题目
设计判断单链表中结点是否关于中心对称的算法(其实就是单链表中的序列是否是回文数)
代码
#include <iostream>
using namespace std;
typedef char ElemType;
#define MAX 100
//定义链表
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
//定义栈
typedef struct Stack{
ElemType data[MAX];
int top;
}Stack;
//创建单链表
void createLinkList(LinkList &L){
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
LNode *p;
ElemType e;
cin>>e;
while(e!='@'){
p=(LNode *)malloc(sizeof(LNode));
p->data=e;
p->next=L->next; //头插法
L->next=p;
cin>>e;
}
}
//遍历链表
void dispLinkList(LinkList L){
LNode *p=L->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//进栈
bool Push(Stack &S,ElemType e){
if(S.top==MAX-1)
return false;
else{
S.data[++S.top]=e;
return true;
}
}
//出栈
bool Pop(Stack &S,ElemType &x){
if(S.top==-1)
return false;
else{
x=S.data[S.top--];
return true;
}
}
//初始化栈
void initStack(Stack &S){
S.top=-1;
}
/**
* 算法主体
**/
bool judehuichen(LinkList L){
Stack S;
initStack(S); //初始化栈
bool flag=true;
ElemType x;
LNode *p=L->next;
while(p){
Push(S,p->data);
p=p->next;
}
p=L->next;
while(S.top!=-1&&flag==true){
Pop(S,x);
if(x!=p->data)
flag=false;
p=p->next;
}
return flag;
}
int main() {
LinkList L;
createLinkList(L);
dispLinkList(L);
bool result = judehuichen(L);
if(result)
cout<<"中心对称!" ;
else
cout<<"不中心对称!";
return 0;
}