非循环单链表的排序问题。有详细注视,求大神解惑!!!
单链表无法正常排序,从结果看是部分排序不正常,请大神帮我看看,到底是哪里出了问题,谢谢啦!注释我尽量写了,有写的不对的也请各位看官指出来。再次谢谢!
排序函数为void ListSort(PNODE pnd)
大致思路如下:
将外层循环中的第i个结点的数据域值和内存循环中的第i个结点之后的数据域值逐个比较,得到最小的,赋给外层循环的第i个结点的数据域。
就是数组的冒泡思路。具体程序如下,求指点,求斧正,各种求!!!!
程序代码:
#include "stdio.h" #include "malloc.h" #include "stdlib.h" //提供exit函数的原型 typedef struct node { int data; struct node * pNext; }NODE , *PNODE; PNODE CreateList(); //构造一个空的线性表 void DestroyList(PNODE); //销毁线性表 void ClearList(PNODE); //将线性表置位空表 int ListEmpty(PNODE); //判断线性表是否为空 int ListLength(PNODE); //求线性表中结点的个数 int GetElem(PNODE , int K); //返回线性表中第k个结点的指针 void LocateElem(); // PNODE PriorElem(PNODE , int where); //得到第n个结点的前驱结点 void NextElem(); void InsertElem(PNODE , PNODE , int where); //将当前结点插入到链表中的where位置 int ListDelete(PNODE , int where); //删除第where个结点,并返回该结点的值。 void ListTraverse(PNODE ); //遍历输出 void ListSort(PNODE); //链表的数据值排序 void ChangeList(PNODE , int n , int m); //交换结点n和结点m的位置 void main() { PNODE phead; phead = CreateList(); ListSort(phead); ListTraverse(phead); } PNODE CreateList(void) { int i = 0; int nNum; int nVal; PNODE phead,ptail;//phead是指向头结点的指针,ptail是指向尾结点的指针 phead = (PNODE)malloc(sizeof(NODE)); //生成一个头结点,用头指针phead指向该结点 if(phead == NULL) { puts("内存分配失败!程序终止"); exit(-1); } ptail = phead; //将尾指针指向头结点 ptail->pNext = NULL; //将尾指针的指针域置位空 printf("请输入你的要生成的链表的结点数:"); scanf("%d" , &nNum); for(i = 0 ; i < nNum ; i++) { PNODE pNew = (PNODE)malloc(sizeof (NODE)); if(phead == NULL) { puts("内存分配失败!程序终止"); exit(-1); } /******初始化结点的数据域*******/ printf("请输入第%d个结点的值:", i+1); scanf("%d" , &nVal); pNew->data = nVal; //将值放入新生成的结点的数据域 /******将新生成的结点挂载到联邦中*******/ ptail->pNext = pNew ; //将指向新生成的结点的指针赋给尾指针所指向的结点(尾结点)的指针域。 ptail = pNew; //将ptail指向新生成的结点。 pNew->pNext = NULL; //将新生成的结点的指针域赋值为空(即尾结点) } return phead; } void ListSort(PNODE pnd) { int i ,j; int tp,temp; //tp用于保存外层循环中第i个结点的data,这个data和内层循环的每一个结点的data比较 PNODE p ; pnd=pnd->pNext; //此时pnd指向首结点,p->data是第一个有效值。 for(i = 0 ; i < ListLength(pnd) ; i++) //ListLength(pnd)该函数计算链表的结点个数。 { tp = pnd->data; //将第i个结点的data赋给tp ,下面的for循环将第i个结点后的每一个结点的data和tp比较大小 for(j = i ; j< ListLength(pnd) ; j++) { p = pnd; //p保存指向第i个结点的指针 if( tp > p->pNext->data) //将第i个结点的data与p的后继结点的data比较, { temp = tp; tp = p->pNext->data; //这三步是交换i个结点的data与第(i+1)个结点的data。 p->pNext->data = temp; } p = p->pNext; //p指向下一个结点, } pnd->data = tp; //此时内层for结束一轮循环,得到最小的data,将这个最小data赋给第i个结点的data pnd=pnd->pNext; //将pnd指向第i个结点的后继,开始下一轮外层for循环。 } } void ListTraverse(PNODE phd) { int i=0,val; PNODE pst; pst = phd->pNext; while( pst != NULL) { val=pst->data; printf("第%d个结点的值是:%d\n",i+1,val); pst = pst->pNext; //pst指向下一个结点 i++; } return ; } int ListLength(PNODE pnt) //求线性表中结点的个数 { int len; PNODE p = pnt; for( len = 0 ; p->pNext != NULL ; len++) p = p->pNext ; return len; }
[ 本帖最后由 venus85 于 2011-11-19 05:59 编辑 ]