用c语言建立一个有序链表?
先按正常流程建立一个链表,再按照其某一个成员值进行冒泡排序(排序过程的交换,只交换链表指针以外的成员值)。
演示代码如下:(演示代码链表20个节点,成员值为随机值)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct slist
{
int a;
struct slist *next;
}SLIST;
SLIST *init();//生成20个节点成员为随机数的链表
void showList(SLIST *slHead);//打印链表
void px(SLIST *slHead,int flag);//float=1:降序。=2升序
int main()
{
SLIST *slHead=NULL;
slHead=init();
printf("排序前:\n");
showList(slHead);
printf("\n降序排序后:\n");
px(slHead,1);
showList(slHead);
printf("\n升序排序后:\n");
px(slHead,2);
showList(slHead);
return 0;
}
void px(SLIST *slHead,int flag)//flag=1:降序。=2升序
{
SLIST *sl0=slHead->next,*sl1=NULL,slSave,*pSave=NULL;
while(sl0)
{
sl1=sl0->next;
while(sl1)
{
if((flag==1 && sl0->a<sl1->a)||(flag==2 && sl0->a>sl1->a))
{
slSave=*sl0;
*sl0=*sl1;
sl0->next=slSave.next;
pSave=sl1->next;
*sl1=slSave;
sl1->next=pSave;
}
sl1=sl1->next;
}
sl0=sl0->next;
}
}
void showList(SLIST *slHead)
{
int i=0;
while(slHead->next)
{
printf("节点%d成员值:%d\n",++i,slHead->next->a);
slHead=slHead->next;
}
printf("\n");
}
SLIST *init()
{
int num,cnt=20;
static SLIST head;
SLIST *slHead=&head,*slTail=NULL,*slNew=NULL;
slHead->next=NULL;
srand(time(NULL));
while(cnt--)
{
num=rand()%100;
slNew=(SLIST *)malloc(sizeof(SLIST));
if(!slNew)return NULL;
slNew->a=num;
slNew->next=NULL;
if(!slHead->next)
slHead->next=slNew;
else
slTail->next=slNew;
slTail=slNew;
}
return slHead;
}
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <math.h>typedef struct yinshu{ unsigned int yz; struct yinshu *next;}YSNode,*YinShu; //定义链表节点类型YSNode,和指针YinShu void InsertNode(unsigned int n, YinShu &L){ //在L链表的第一个节点之后插入一个节点,值为n YinShu p; p=(YinShu)malloc(sizeof(YSNode)); //分配节点空间 p->yz=n; p->next=L->next; L->next=p;} void YinShuFenJie(unsigned int n,YinShu &L){ //对n进行质因数分解,并存在链表L中 unsigned int j,k; k=(unsigned int)sqrt(n); for(j=2;j<=k;++j){ if(n%j==0){ //遇到一个质因数j InsertNode(j,L); n/=j; k=(unsigned int)sqrt(n); --j; } } InsertNode(n,L); //插入剩下的质因数n} int main(){ unsigned int n; YinShu L,p,q; scanf("%d",&n); L=(YinShu)malloc(sizeof(YSNode)); L->yz=n; L->next=NULL;//第一个节点存放n的值 YinShuFenJie(n,L); p=L->next; q=p->next; printf("%u=%u",L->yz,p->yz); free(L); free(p); //释放第一、二个节点 while(q){ p=q; printf("*%u",p->yz); q=p->next; free(p); } printf("\nFinished.\n"); getch(); return 0;}