链表排序,好麻烦,整了大半天!主要思想:用冒泡法,从原始链表中取最小或最大的一个节点,然后加入到新定义的链表指针中,每次取一个直到取完。算法有点笨。 // mytest.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <time.h> #include <string.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include<afxtempl.h> #include <Winsock2.h> #include "rc4.h" typedef struct _pLink { int no; _pLink *Next; }pLink; void createLink(pLink **tlink) { pLink *llink=NULL; for (int i=0;i<2;i++) { pLink *tp=(pLink *)malloc(sizeof(pLink)); memset(tp,0x00,sizeof(pLink)); srand(GetTickCount()+i); tp->no=(((unsigned char)(rand()%100))&0xf); if (!*tlink) { *tlink=tp; llink=tp; } else { llink->Next=tp; llink=llink->Next; } } } pLink *sortLink(pLink *pHeader) { pLink *p0=NULL,*p1=NULL,*p2=NULL,*p3=NULL,*miniPreNode=NULL,*miniNode=NULL,*sortLink=NULL,*sortNode=NULL; p1=pHeader; if (!pHeader) { return NULL; } p0=pHeader; p1=p0; while (p1) { p2=p1; p3=p1->Next; miniNode=p1; miniPreNode=NULL; while(p3) { if (miniNode->no > p3->no) { miniNode=p3; miniPreNode=p2; } p2=p2->Next; p3=p3->Next; } if (miniNode == p1)//未找到比当前节点还要小/大的节点,则将当前节点加入到排序链表 { if (!sortLink) { sortLink=miniNode; sortNode=miniNode; } else { sortNode->Next=miniNode; sortNode=sortNode->Next; } p0=p0->Next; //如果第一个节点是最小/最大。则将第一个节点移至排序链表,并将首节点下沉。否则还是从原始首节点开始查询 } else //将找到的最小节点加入到排序链表 { if (!sortLink) { sortLink=miniNode; sortNode=miniNode; } else { sortNode->Next=miniNode; sortNode=sortNode->Next; } if (p1->Next->Next == NULL)//如果原始链表已经移动未尾的上一个节点,而当前最小/最大节点正好是最后一个。则将当前节点直接附加到排序节点 { sortNode->Next=miniPreNode; miniPreNode->Next=NULL; break; } //将找到的最小节点从原始链表中移除 if (miniNode->Next) { miniPreNode->Next=miniNode->Next; } else//如果最小/最大节点正好是最后一个则将其上一个节点的下一节点置空 { miniPreNode->Next=NULL; } } p1=p0; } return sortLink; } int _tmain(int argc, _TCHAR* argv[]) { pLink *link=NULL,*root=NULL; createLink(&link); if (link) { //输出原始链表 root=NULL; root=link; printf("原始链表数据:/r/n"); while(root) { printf("%d/r/n",root->no); root=root->Next; } pLink *slink=NULL; slink=sortLink(link); if (slink) { root=NULL; root=slink; //输出排序链表 printf("排序链表数据:/r/n"); while(root) { printf("%d/r/n",root->no); root=root->Next; } } printf("排序完成"); } return 0; }