#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
typedef struct node
{
int data;
struct node *next;
}DataNode,*DataList;
int InitDataList(DataList *s)
{
*s=(DataList)malloc(sizeof(DataNode));
if(*s==NULL) return 0;
(*s)->data=0;
(*s)->next=NULL;
return 1;
}
int DestroyDataList(DataList *s)
{
DataList p,q;
if(*s==NULL) return 1;
p=(*s)->next;
while(p!=NULL)
{
q=p;
p=p->next;
free(q);
}
free(*s);
*s=NULL;
return 1;
}
int CreateDataList(DataList s,int data[],int n)
{
int i;
DataList p,q;
if(s==NULL||n<=0) return 0;
for(p=s,i=0;i<n;i++)
{
q=(DataList)malloc(sizeof(DataNode));
if(q==NULL) return 0;
q->data=data[i];
q->next=p->next;
p->next=q;
p=q;
}
return 1;
}
#define Sign(x) ((x)>=0?1:0)
int SortDataList(DataList s)
{
DataList p,q,r,t;
if(s==NULL) return 0; /*头结点都不存在*/
p=s->next;
if(p==NULL) return 1; /*除头结点外,没有其他结点*/
q=p->next;
while(q!=NULL)
{
if(Sign(q->data)!=Sign(p->data)) /*2个不同符号的数*/
break;
p=q;
q=q->next;
}
if(q==NULL) return 1; /*不存在2个不同符号的数,链表已经符合要求*/
r=q->next; /*开始处理剩余结点*/
while(r!=NULL)
{
t=r; /*标记当前结点*/
r=r->next;
if(Sign(t->data)==Sign(p->data)) /*t的符号与p符号相同。而与q符号不同,需将t移到p后面*/
{
q->next=t->next; /*t的前驱q指向t的后继*/
t->next=p->next; /*t的后继指向p的后继*/
p->next=t; /*p的后继指向t*/
p=t; /*刷新第一种符号数据的最后一个指针为t*/
}
else /*t的符号与q的符号一致,不需移动*/
{
q=t; /*刷新第二种符号数据的最后一个指针为t*/
}
}
return 1;
}
int PrintDataList(DataList s)
{
DataList p;
if(s==NULL) return 0;
p=s->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 0;
}
int main(void)
{
int n,data[4][10]={
{1,-2,3,-4,5,-6,7,-8,9,-10},
{-1,-2,3,-4,5,-6,7,-8,9,-10},
{1,2,3,-4,5,-6,7,-8,9,-10},
{10,-21,-35,-4,50,-6,73,-88,91,-10}
};
DataList L;
for(n=0;n<4;n++)
{
InitDataList(&L);
CreateDataList(L,data[n],10);
PrintDataList(L);
SortDataList(L);
PrintDataList(L);
DestroyDataList(&L);
printf("\n\n");
}
getch();
return 0;
}