| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 571 人关注过本帖
标题:非循环单链表的排序问题。有详细注视,求大神解惑!!!
只看楼主 加入收藏
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
结帖率:64.71%
收藏
已结贴  问题点数:80 回复次数:3 
非循环单链表的排序问题。有详细注视,求大神解惑!!!
单链表无法正常排序,从结果看是部分排序不正常,请大神帮我看看,到底是哪里出了问题,谢谢啦!
注释我尽量写了,有写的不对的也请各位看官指出来。再次谢谢!

排序函数为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 编辑 ]
搜索更多相关主题的帖子: color 内存 
2011-11-19 05:57
爱的轩辕氏
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:71
专家分:157
注 册:2011-5-8
收藏
得分:80 
  你那排序太复杂了吧,我帮你写个排序,你试试
  void sort_list(PNODE phead)
  {
     pnode p,q;
     int t;
     for(i=0,p=phead->next;i<LISTlenth(phead)-1;i++,p=p->next)
         {
            for(j=i+1,q=p->next;j<LISTlength(phead);j++,q=q->next)
                {
                   if(p->data > q->data)
                       {
                          t = q->data;
                          q->data = p->data;
                          p->data = t;
                       }
                 }
          }
 就相当于冒泡排序

[ 本帖最后由 爱的轩辕氏 于 2011-11-19 09:58 编辑 ]
2011-11-19 09:56
爱的轩辕氏
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:71
专家分:157
注 册:2011-5-8
收藏
得分:0 
int i,j;我没写上
2011-11-19 09:57
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
收藏
得分:0 
回复 3楼 爱的轩辕氏
谢谢,但我还是想知道我的错误在哪儿
2011-11-19 18:12
快速回复:非循环单链表的排序问题。有详细注视,求大神解惑!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015997 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved