www.pudn.com > zb.rar > 001.C
#include "stdio.h"
#include "conio.h"
#define NULL 0
struct list
{int data;
struct list *next;
};
typedef struct list lnode;
typedef lnode *list;
list create1() /*建立链表*/
{list L,p;
int data;
L=(list)malloc(sizeof(lnode));
L->next=NULL;
printf("please input the data for a list(end by -999):\n");
do{p=(list)malloc(sizeof(lnode));
scanf("%d",&data);
p->data=data;
p->next=L->next;
L->next=p;
}
while(data!=-999);
L->next=p->next;
return(L);
}
list fpre1(list p,list L) /*在L中找P的前趋*/
{list q;
q=L;
while(q->next!=p)
q=q->next;
return(q);
}
list ylist1(list L) /*找链表中从L开始的最小结点*/
{list p,min;
p=L;
min=L;
while(p->next!=NULL)
{p=p->next;
if(p->datadata)
min=p;
}
return(min);
}
list xlist1(list L) /*排序链表(按递增排序)*/
{list min,q,i,p;
p=L->next;
i=L;
if(p->data==NULL)
printf("the list is empty\n");
else
{
do{
min=ylist1(p);
q=fpre1(min,L);
q->next=min->next;
min->next=i->next;
i->next=min;
i=min;
p=i->next;
}
while(i->next->data!=NULL);
}
return(L);
}
list reround(list L) /*链表倒置*/
{list q,p,s;
p=L;
while(p->next!=NULL)
p=p->next;
s=p;
q=fpre1(p,L);
while(q!=L)
{p->next=q;
p=q;
q=fpre1(q,L);
}
p->next=NULL;
L->next=s;
return(L);
}
list mergelist1(list La,list Lb) /*将La和Lb合并为链表Lc*/
{list pa,pb,pc,Lc;
pa=La->next;
pb=Lb->next;
pc=Lc=La;
while((pa->data!=NULL)&&(pb->data!=NULL))
{if(pa->data>=pb->data)
{pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{pc->next=pb;
pc=pb;
pb=pb->next;
}
}
if(pa->data==NULL)
pc->next=pb;
else
pc->next=pa;
return(Lc);
}
void plist1(list L) /*打印链表*/
{list p;
p=L;
if(p->next->data==NULL)
printf("the list is empty\n");
else
{p=p->next;
while(p->next!=NULL)
{printf("%d\t",p->data);
p=p->next;
}
printf("%d\n",p->data);
}
}
LIST()
{list La,Lb,Lc,pa,pb,qa,qb;
La=create1();
pa=xlist1(La);
printf("La:\t");
plist(pa);
qa=reround(pa);
Lb=create1();
pb=xlist1(Lb);
printf("Lb:\t");
plist1(pb);
qb=reround(pb);
Lc=mergelist1(qa,qb);
printf("Lc:\t");
plist(Lc);
getch();
}