| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 603 人关注过本帖
标题:请 高手 帮我看看 这个排序 错误在哪里?
只看楼主 加入收藏
qqoo6789
Rank: 1
等 级:新手上路
帖 子:34
专家分:7
注 册:2013-7-11
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:8 
请 高手 帮我看看 这个排序 错误在哪里?
//为了更好的找到 错误,经过 很大的简化
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct Node//节点
{
    int data;
    struct Node *Pnext;
}Node,*PNode;
PNode create_list(void);//输入n长度,分配节点...........反复检查,该函数无误
void traverse_list(PNode Phead);//全部输出..............反复检查,该函数无误
int changdu(PNode Phead);//计算长度.....................反复检查,该函数无误
void paixu(PNode Phead);//排序(从小到大)..........................不知道 问题出在哪里?排序后的输出 结果,与没排序前 一样

int main ()
{
    PNode Phead = (PNode)malloc(sizeof(Node));//创建一个头节点

    Phead = create_list();//创建的过程,连 数据一起输入了

    traverse_list(Phead);//输出一次检查看
    paixu(Phead);//经过排序处理
    traverse_list(Phead);//在输出一次 检查......发现这个排序 没效果..
    return 0;
}
   

PNode create_list(void)
{
    int len;//节点长度
    printf("请输入你要分配的节点个数\n");
    scanf("%d",&len);

    PNode Phead = (PNode)malloc(sizeof(Node));//头节点
    if(Phead == NULL)
    {
        printf("分配失败\n");
        exit(-1);
    }
    PNode Ptail = (PNode)malloc(sizeof(Node));//当做  移动的尾节点
    if(Ptail == NULL)
    {
        printf("分配失败\n");
        exit(-1);
    }
    Ptail = Phead;//将头节点放入 移动的尾节点
    Ptail->Pnext = NULL;
   
    int i;
    int val;//暂时存放 输入值data
    for(i=1;i<=len;i++)
    {
        printf("输入信息\n");
        scanf("%d",&val);
        PNode Pnew = (PNode)malloc(sizeof(Node));//创建一个新的节点
        if(Pnew == NULL)
        {
            printf("分配失败\n");
            exit(-1);
        }
        
        Pnew->data = val;//将数据 放进 新节点内容区

        Ptail->Pnext = Pnew;//让 移动的位节点 指向新节点
        Pnew->Pnext = NULL;//将 新节点的 指针区 清零
        Ptail = Pnew;//移动 的尾节点 移动到 最尾
    }

    return Phead;
}
void traverse_list(PNode Phead)//输出全部信息
{
    if(Phead->Pnext == NULL)
    {
        printf("这是个空表\n");
        return;
    }
    PNode P = (PNode)malloc(sizeof(Node));//创建一个新的节点
        if(P == NULL)
    {
        printf("分配失败\n");
        exit(-1);
    }
    int i=1;
    P = Phead;
    while(1)
    {
        P = P->Pnext;//P指向有效区
        if(P == NULL)
            break;
        else
        {
            printf("第%d个数是%d\n",i,P->data);
            i++;
        }
    }
}



int changdu(PNode Phead)//计算长度
{
    int len;
    PNode P = (PNode)malloc(sizeof(Node));
    if(P == NULL)
    {
        printf("分配失败\n");
        exit(-1);
    }
    P = Phead;
    len=0;
    while(P->Pnext!=NULL)
    {
        P = P->Pnext;
        len++;
    }
    return len;
}

void paixu(PNode Phead)//这个怎么  排序无效,想不懂
{
    int len=changdu(Phead);
    int i,j;
    int temp;
    PNode P;
    PNode Q;
    for(i=1,P=Phead->Pnext;i<=len-1;i++,P=P->Pnext);
        for(j=i+1,Q=P->Pnext;j<=len;j++,Q=Q->Pnext)
        {
            if(P->data>Q->data)
            {
                temp = P->data;
                P->data = Q->data;
                Q->data = temp;        
            }
        }
        
    printf("已排序完成“标志”\n");
}
/************************************测试数据******************************************
请输入你要分配的节点个数
5
输入第1个节点的信息
5
输入第2个节点的信息
4
输入第3个节点的信息
3
输入第4个节点的信息
2
输入第5个节点的信息
1
第1个数是5
第2个数是4
第3个数是3
第4个数是2
第5个数是1
已排序完成“标志”
第1个数是5
第2个数是4
第3个数是3
第4个数是2
第5个数是1
Press any key to continue

**************************************************************************************/

找了很久没找到 错误的地方,请 大神 指点,在这里先谢谢了!
搜索更多相关主题的帖子: include 
2014-04-04 17:16
qqoo6789
Rank: 1
等 级:新手上路
帖 子:34
专家分:7
注 册:2013-7-11
收藏
得分:0 
很惨烈。。没有人愿意看看..
2014-04-05 15:42
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
我调到第二行就没敢再继续,主函数中

PNode Phead = (PNode)malloc(sizeof(Node));//创建一个头节点
Phead = create_list();//创建的过程,连 数据一起输入了


这两行明显矛盾,Phead申请空间,又重新赋值,他申请到的空间如何释放?

同样的问题出现在 除 排序 外的所有函数中

程序代码:
//create_list
PNode Ptail = (PNode)malloc(sizeof(Node));//当做  移动的尾节点
......
Ptail = Phead;//将头节点放入 移动的尾节点

//traverse_list
PNode P = (PNode)malloc(sizeof(Node));//创建一个新的节点
......
P = Phead;

//changdu
PNode P = (PNode)malloc(sizeof(Node));
......
P = Phead;


[fly]存在即是合理[/fly]
2014-04-05 23:15
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 
排序 无效的原因 很简单

for(i=1,P=Phead->Pnext;i<=len-1;i++,P=P->Pnext)//; 这里多一个分号


[fly]存在即是合理[/fly]
2014-04-05 23:24
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
建议学会自己写释放空间的代码,malloc后必跟free

程序代码:
void Destroy_list(PNode Phead)
{
    if (NULL == Phead)  return;
    Destroy_list(Phead->Pnext);
    free(Phead);
}


[fly]存在即是合理[/fly]
2014-04-05 23:25
qqoo6789
Rank: 1
等 级:新手上路
帖 子:34
专家分:7
注 册:2013-7-11
收藏
得分:0 
回复 4楼 azzbcc
我简直被 自己气死...
2014-04-06 00:16
qqoo6789
Rank: 1
等 级:新手上路
帖 子:34
专家分:7
注 册:2013-7-11
收藏
得分:0 
以下是引用azzbcc在2014-4-5 23:15:58的发言:

我调到第二行就没敢再继续,主函数中

PNode Phead = (PNode)malloc(sizeof(Node));//创建一个头节点
Phead = create_list();//创建的过程,连 数据一起输入了

这两行明显矛盾,Phead申请空间,又重新赋值,他申请到的空间如何释放?

同样的问题出现在 除 排序 外的所有函数中

//create_list
PNode Ptail = (PNode)malloc(sizeof(Node));//当做  移动的尾节点
......
Ptail = Phead;//将头节点放入 移动的尾节点

//traverse_list
PNode P = (PNode)malloc(sizeof(Node));//创建一个新的节点
......
P = Phead;

//changdu
PNode P = (PNode)malloc(sizeof(Node));
......
P = Phead;


那么就是直接定义就可以了。
2014-04-06 00:17
qqoo6789
Rank: 1
等 级:新手上路
帖 子:34
专家分:7
注 册:2013-7-11
收藏
得分:0 
以下是引用azzbcc在2014-4-5 23:25:55的发言:

建议学会自己写释放空间的代码,malloc后必跟free

void Destroy_list(PNode Phead)
{
    if (NULL == Phead)  return;
    Destroy_list(Phead->Pnext);
    free(Phead);
}


非常感谢。明白了
2014-04-06 00:18
qqoo6789
Rank: 1
等 级:新手上路
帖 子:34
专家分:7
注 册:2013-7-11
收藏
得分:0 
以下是引用qqoo6789在2014-4-6 00:17:40的发言:



那么就是直接定义就可以了。

这让我学到了。这次问了这个问题,意外获得知识,太值得了。
2014-04-06 00:22
快速回复:请 高手 帮我看看 这个排序 错误在哪里?
数据加载中...
 
   



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

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