| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 500 人关注过本帖
标题:请教链表排序问题
只看楼主 加入收藏
lixnkei
Rank: 4
来 自:樱之国度
等 级:业余侠客
帖 子:133
专家分:227
注 册:2008-5-13
结帖率:100%
收藏
 问题点数:0 回复次数:1 
请教链表排序问题
程序代码:
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h> 


//函数前置声明
struct Student * InputStudent(int);
void OutputStudent(struct Student *);
void paixu(struct Student *);


//学生结构体
struct Student
{
    int a;        //年龄
    char b[10];   //姓名
    struct Student * pNext; //指针域
};


//主函数
int main(void)
{
    int len;
    printf("请输入学生的人数:");
    scanf("%d", &len);
   
    struct Student * p;
    p = InputStudent(len);
    printf("\n\n");
    paixu(p);
   
    OutputStudent(p);
    return 0;
}


//输入函数
struct Student * InputStudent(int len)
{
    int i;
   
    //构建头结点
    struct Student * p = (struct Student *)malloc(sizeof(struct Student));
   
    if( NULL == p)
    {
        printf("构建失败!");
        exit(-1);
    }
       
   
     //构建链表
     struct Student * t = p;
     t->pNext = NULL;
    
    for(i=0; i<len; i++)
    {
        struct Student * pNEW = (struct Student *)malloc(sizeof(struct Student));
        if( NULL == pNEW)
        {
            printf("构建失败!");
            exit(-1);
        }
       
        printf("请输入第 %d 个学生的信息:\n", i+1);
        printf("年龄:");
        scanf("%d", &pNEW->a);
        printf("姓名:");
        scanf("%s", pNEW->b);
       
        t->pNext = pNEW;
        pNEW->pNext = NULL;
        t = pNEW;
       
    }
   
    return p;
}

//输出函数
void OutputStudent(struct Student * p)
{
    int i = 1;
    p = p->pNext;
   
    while( NULL != p)
    {
        printf("第 %d 个学生的信息:\n", i);
        printf("年龄:%d", p->a);
        printf("姓名:%s\n", p->b);
        p = p->pNext;
        i++;
    }
    return;
}


//排序函数
void paixu(struct Student * p)
{
    struct Student * t;
    struct Student * t1;
    struct Student * t2;
    struct Student tt;
    int z = 0;
    int i, j;
    p = p->pNext;//取首节点
    t = t2 = p;
   
    //取链表数
    while( NULL != t)
    {
        z++;
        t = t->pNext;
    }
   
    t = p->pNext;//取第二节点
   
    //开始循环比较
    for(i=0; i<z; i++)
    {
        for(j=0; j<z-i; j++)
        {
            if( (p->a) < (t->a) )
            {
                tt = *p;
                *p = *t;
                *t = tt;
   
                t1 = p->pNext;
                p->pNext = t->pNext;
                t->pNext = t1;
            }
           
           
           
            //进入下一个节点
            p = p->pNext;
            t = t->pNext;

            //获取首节点地址进入第二次的i循环
            if( NULL == t) 
            {
                p = t2;
                t = p->pNext;
            }
        }
    }
    return;
}


终于排障并完成了排序了。。。。

[ 本帖最后由 lixnkei 于 2010-3-8 16:16 编辑 ]
搜索更多相关主题的帖子: 链表 
2010-03-08 12:24
lixnkei
Rank: 4
来 自:樱之国度
等 级:业余侠客
帖 子:133
专家分:227
注 册:2008-5-13
收藏
得分:0 
发现问题了,链表排序不该用数组排序的方法来写 。互调后把指针弄乱了。。。。


老师说:会写代码的人多如牛毛,但写得很规范的却不多。代码要规范,养成好习惯~!
2010-03-08 12:57
快速回复:请教链表排序问题
数据加载中...
 
   



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

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