#include <stdio.h>
#include<stdlib.h>
#include<iostream>
#include<stack>
using namespace std;
#define SUCCESS 1000001
#define FAILURE 1000002
#define TRUE 1000003
#define FALSE 1000004
typedef int ElemType;
struct node
{
ElemType data;
struct node *next;
};
typedef struct node Node;
typedef Node *LinkList;
int ListInit(LinkList *L);
int ListInsert(LinkList *L,int i,ElemType e);
int ListTraverse(LinkList L,ElemType(*print)(ElemType));
ElemType visit(ElemType e);
bool isSame(LinkList L, int len)
{
LinkList p=L->next;
stack<ElemType> st;
int n=len/2;
for(int i=0;i<n;i++)
{
st.push(p->data);
p=p->next;
}
if(len%2==1) p=p->next;
for(int i=0;i<n;i++)
{
if(p->data==st.top())
{
st.pop();
p=p->next;
}
else
return false;
}
return true;
}
bool isSame2(LinkList L, int len)
{
LinkList p=L->next,p1,p2,pt;
int n=len/2;
if(len==1)
return true;
p1=p;
for(int i=0;i<n;i++)
{
p=p->next;
}
if(len%2==1) p=p->next;
p2=p->next;
if(p2!=NULL)
{
p->next=NULL;
for(int i=0;i<n-1;i++)
{
pt=p2->next;
p2->next=p;
p=p2;
p2=pt;
}
}
p2=p;
for(int i=0;i<n;i++)
{
if(p1->data==p2->data)
{
p1=p1->next;
p2=p2->next;
}
else
return false;
}
return true;
}
int main()
{
int ret,i;
LinkList list;
int place;
ElemType e;
ret = ListInit(&list);
for(i = 0; i < 5; i++)
{
ret = ListInsert(&list,i+1,i);
}
for(i = 0; i < 5; i++)
{
ret = ListInsert(&list,i+6,5-i-1);
}
ret = ListTraverse(list,visit);
cout<<endl;
cout<<endl<<isSame(list,10)<<endl;
cout<<endl<<isSame2(list,10)<<endl;
return 0;
}
int ListInit(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(Node));
if(NULL == (*L))
{
return FAILURE;
}
(*L)->next = NULL;
return SUCCESS;
}
int ListInsert(LinkList *L,int i,ElemType e)
{
LinkList p = *L;
int j = 1;
while( p != NULL && j < i)
{
p = p->next;
j++;
}
if( p == NULL || j > i)
{
return FAILURE;
}
LinkList n = (LinkList)malloc(sizeof(Node));
if(NULL == n)
{
return FAILURE;
}
n->data = e;
n->next = p->next;
p->next = n;
return SUCCESS;
}
ElemType visit(ElemType e)
{
printf("%d ",e);
return e;
}
int ListTraverse(LinkList L,ElemType(*print)(ElemType))
{
if(NULL == L)
{
return FAILURE;
}
LinkList p = L->next;
while(p)
{
p->data=print(p->data);
p = p->next;
}
return SUCCESS;
}