/**
算法思想:如果有序有两种情况1.递增2.递减,注意有相邻相等情况
从前之后两两比较相邻节点差值
**/
#include <stdio.h>
#include <stdlib.h>
//链表结构体
typedef struct lNode
{
int data;
struct LNode *next;
}LNode;
// 返回值0:无序 1:有序
// init 、flag 0:两个值相等 1:递增 -1:递减
int isOrder(LNode *l)
{
LNode *p,*q;
int flag,init;//init为第一个结点标记 flag为循环中标记
p=l;//p指向开始结点
q=p->next;//q指向p的下一个结点
while(p->data==q->data&&q->next!=NULL)//恰好两个比较的值相等
{
p=p->next;
q=p->next;
}
if(p->data>q->data) init=-1;//递减
else if (p->data<q->data) init=1;//递增
else {
init=0;//从头至尾都相等
return 1;
}
while(q)
{
if(p->data>q->data) flag=-1;//递减
else if (p->data<q->data) flag=1;//递增
else flag=0;//说明此时链表中元素均相等
if(flag+init==0) return 0;//无序
p=p->next;
q=q->next;
}
return 1;
}
//链表建立,测试数据
LNode* create()
{
LNode *c,*s,*r;
s=(LNode*)malloc(sizeof(LNode));
s->next=NULL;
s->data=6;
r=s;
c=s;
s=(LNode*)malloc(sizeof(LNode));
s->next=NULL;
s->data=6;
r->next=s;
r=r->next;
s=(LNode*)malloc(sizeof(LNode));
s->next=NULL;
s->data=5;
r->next=s;
r=r->next;
s=(LNode*)malloc(sizeof(LNode));
s->next=NULL;
s->data=4;
r->next=s;
r=r->next;
s=(LNode*)malloc(sizeof(LNode));
s->next=NULL;
s->data=1;
r->next=s;
r=r->next;
s=(LNode*)malloc(sizeof(LNode));
s->next=NULL;
s->data=1;
r->next=s;
r=r->next;
return c;
}
int main()
{
LNode *l = create();;
printf("%d",isOrder(l));
}