非循环单链表的排序问题。有详细注视,求大神解惑!!!
单链表无法正常排序,从结果看是部分排序不正常,请大神帮我看看,到底是哪里出了问题,谢谢啦!注释我尽量写了,有写的不对的也请各位看官指出来。再次谢谢!
排序函数为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 编辑 ]








