| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1615 人关注过本帖
标题:这个链表的排序哪里有问题? sort函数有问题
只看楼主 加入收藏
万士心平
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-1-30
结帖率:55.56%
收藏
已结贴  问题点数:20 回复次数:4 
这个链表的排序哪里有问题? sort函数有问题
#include<stdio.h>
#include<stdlib.h>
struct stu  //声明学生信息结构体
{
    char name[20];
    int num;
    float score;
    struct stu *next;
};
main()
{    struct stu *sort(struct stu *p); //声明排序函数
    struct stu *create(struct stu *p,int n);
    struct stu *head,*p;
    head=(struct stu *)malloc(sizeof(struct stu));
    int n;  //n是学生数目
    printf("请输入学生数目");
    scanf("%d",&n);
    while(n>=100)
    {
    scanf("%d",&n);
    }
    head=create(head,n);  //创建链表
    head=sort(head);    //按照什么排序
    p=head->next;
    while(p)
    {
        printf("%5s %5d %.3f",p->name,p->num,p->score);
        p=p->next;
    }
}
struct stu *create(struct stu *p,int n)
{   struct stu *pp,*pt;
    pt=p;
    int i;
    for(i=0;i<n;i++)
    {    pp=(struct stu *)malloc(sizeof(struct stu));
        printf("请输入学生姓名:");   
        scanf("%s",pp->name);
        printf("请输入学生学号:");
        scanf("%d",&pp->num);
        printf("请输入学生成绩:");
        scanf("%f",&pp->score);
        pt->next=pp;
        pt=pp;
    /*    if(i==n-1)
        {
            p->next=NULL;
            
        }
        else
        {    p=(struct stu *)malloc(sizeof(struct stu));
            pt->next=p;
            pt=p;
        
        }
   
      */

    }
    pp->next=NULL;
return p;

}
struct stu *sort(struct stu *p)  //排序,返回一个指针
{
    struct stu *first,*cursor,*max,*prev; //prev用来跟踪max
    first=p;
    prev=first;
    p=p->next;
    while(p)
    {
    for(max=cursor=p;cursor;cursor=cursor->next)  //找到最大的
   
    {
        if(cursor->score>max->score)
        {
            max=cursor;
            break;
        }
    }
    while(prev->next!=max)  //找到max
    {
    prev=prev->next;
    }
    prev->next=max->next;
    max->next=p->next; //把max和p连接起来
    p->next=max;
    p=p->next;  //p向后移,减少比较范围
    prev=first;
    }
    return first;

}
搜索更多相关主题的帖子: 链表 sort 函数 
2010-07-16 18:15
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:5 
错误之一 不可连续赋值
错误之二 。。。。。。

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-16 18:54
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:5 
你参考一下这些链表排序,希望对你的解题有所帮助:
请看ListSort3(L);
程序初始顺序是:6 3 67 2 15 13 10 6 4
排好序的顺序是:3 2 4 6 6 67 15 13 10

#include<stdio.h>
#include <stdlib.h>
#include <math.h>

/************************************************************************/
/* 常量定义 */
/************************************************************************/
#define ElemType int
#define Status int
#define TRUE 1
#define OK 1
#define FALSE 0
#define ERROR -1

/************************************************************************/
/* 线性表的单链表存储结构*/
/************************************************************************/
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;

/************************************************************************/
/* 操作结果:构造一个空的线性表L */
/************************************************************************/
void InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
if( !*L ) /* 存储分配失败 */
exit(OVERFLOW);
(*L)->next = NULL; /* 指针域为空 */
}

/************************************************************************/
/* 在带头结点的单链线性表L中第i个位置之前插入元素e */
/************************************************************************/
Status ListInsert(LinkList L, int i, ElemType e)
{
int j = 0;
LinkList p = L, s;
while( p && j < i-1) /* 寻找第i-1个结点 */
{
p = p->next;
j++;
}
if( !p|| j > i-1) return ERROR;/* i小于1或者大于表长 */

s = (LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
s->data = e; /* 插入L中 */
s->next = p->next;
p->next = s;
return OK;
}


/************************************************************************/
/* 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi() */
/************************************************************************/
void ListTraverse(LinkList L, void(*vi)(ElemType))
{
LinkList p = L->next;
while(p)
{
vi(p->data);
p = p->next;
}
printf("\n");
}

void printInt(int data)
{
printf("%d ", data);
}


void ListSort3(LinkList L)
{
LinkList first; //指向链表L第一个结点,除头结点
LinkList pre; //指向first的前驱结点
LinkList last; //指向first指向排好序的最后一个结点
LinkList rest; //指向未排好序的第一个结点,即链表第二个结点
LinkList curr; //指向当前结点

first = L->next; //指向第一个结点
if(first == NULL) return;

pre = L ; //pre指向first的前驱结点
last = first; //last指向排好序的最后一个结点
rest = first->next; //指向剩余的结点
first->next = NULL; //first断链

while (rest) //当余下的结点不为空
{
//保存当前结点
curr = rest;

//取下一个结点
rest = rest->next;

//当结点小于第一个结点,则链接到first前面
if( curr->data < first->data )
{
pre->next = curr;
curr->next = first;
pre = curr;
}
//当前结点大于第一个结点,则链接到last后
else if(curr->data > first->data)
{
curr->next = last->next;
last->next = curr;
last = curr;
}
//当前结点与第一个结点相等,则链接到first后面
else
{
curr->next = first->next;
first->next = curr;
}
}
}

void main()
{
LinkList L;
InitList(&L);
ListInsert(L, 1, 6);
ListInsert(L, 2, 3);
ListInsert(L, 3, 67);
ListInsert(L, 4, 2);
ListInsert(L, 5, 15);
ListInsert(L, 6, 13);
ListInsert(L, 7, 10);
ListInsert(L, 8, 6);
ListInsert(L, 9, 4);

ListSort3(L);
ListTraverse(L, printInt);
}
收到的鲜花
  • Devil_W2010-07-16 21:23 送鲜花  -1朵   附言:写的很一般。

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-16 19:19
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:5 
程序代码:
#include<iostream>
#include<cstdlib>
#include<utility>
#include<cassert>
using std::pair;
template<class Type>
class List
{
public:
    struct Node{
    Type val;
    Node():pre(this),next(this){}
    Node(Type key):pre(this),next(this)
        {
        val=key;
        }
    Node(Node &node)
        {
        this->val=node.val;
        }
    Node &operator=(Node & node)
        {
        this->val=node.val;
        }
    ~Node()
        {
        
        }
    friend std::ostream & operator<<(std::ostream &os,Node &node)
        {
        os<<node.val<<" ";
        return os;
        }
    Node* pre;
    Node* next;
    };
    typedef Node* iter;
    List()
    {
        tail=new Node();
    }
    virtual ~List(){
    destroy();
    assert( tail->next==tail);
    delete tail;
    }
    std::size_t size();
    virtual void insert(Type key);
    virtual void erase(iter it);
    iter begin(){ return tail->next;}
    iter end(){ return tail;}
    void walk();
protected:
    void swap(Node  &n1,Node &n2)
    {
        Node tmp=n1;
        n1=n2;
        n2=tmp;
    }
    void destroy();
private:
    iter tail;
};

template<class Type>
void List<Type>::insert(Type key)
{
    if( NULL==tail )
    {
    tail=new Node(key);
    tail->pre=tail;
    tail->next=tail;
    }
    else
    {
    iter it=new Node(key);
    it->pre=tail->pre;
    it->pre->next=it;
    it->next=tail;
    it->next->pre=it;
    }
}
template<class Type>
void List<Type>::erase(iter it)
{
    it->pre->next=it->next;
    it->next->pre=it->pre;
    delete it;
}
template<class Type>
std::size_t List<Type>::size()
{
    if( tail==tail->next)
    return 0;
    else
    {
    std::size_t sz=0;
    for(iter it=begin();it!=end();it=it->next)
    {
        sz++;
    }
    return sz;
    }
}
template<class Type>
void List<Type>::walk()
{
    iter it=tail;
    if( NULL != tail)
    {
    for(it=tail->next;it!=tail;it=it->next)
    {
        std::cout<<*it<<" ";
    }
    std::cout<<std::endl;
    }
}
template<class Type>
void List<Type>::destroy()
{
    for(List<Type>::iter it=begin();it !=end();it=it->next)
    {
    erase(it);
    }
}
template<class Type>
class Rank:public List<Type>{
public:
    Rank():List<Type>(){}
    void qsort()
    {
        sort(1,List<Type>::size(),List<Type>::begin(),(List<Type>::end())->pre);
    }
    typename List<Type>::Node * _rank_k(int k);
    ~Rank(){}
protected:
    pair<typename List<Type>::Node*,int> 
    partition(int p,int r,typename List<Type>::Node * pt,typename List<Type>::Node* rt)
        {
             Type x=rt->val;
        int i=p-1,j;
        typename List<Type>::Node* it;
        typename List<Type>::Node* jt;
        it=pt->pre;
        jt=pt;
        for(j=p;j<r;j++)
        {
        if(jt->val<=x)
        {
            i=i+1;
            it=it->next;
            swap(*it,*jt);
        }
        jt=jt->next;
        }
        swap(*(it->next),*rt);
        return std::make_pair(it->next,i+1);
    }
    void sort(int p,int r,typename List<Type>::Node* pt,typename List<Type>::Node* rt)
    {
        if( p< r )
        {
        pair<typename List<Type>::Node*,int> qt;
        qt=partition(p,r,pt,rt);
        sort(p,qt.second-1,pt,qt.first->pre);
        sort(qt.second+1,r,qt.first->next,rt);
        }
    }
    typename List<Type>::Node* select(int p,int r,int i,typename List<Type>::Node* pt,typename List<Type>::Node* rt);
}; 
template<class Type>
typename List<Type>::Node * Rank<Type>::_rank_k(int k)
{
    assert(k+1<=List<Type>::size() &&k+1>0);
    return select(1,List<Type>::size(),k+1,List<Type>::begin(),List<Type>::end());
}
template<class Type>
typename List<Type>::Node* 
Rank<Type>::select(int p,int r,int i,typename List<Type>::Node*pt,typename List<Type>::Node * rt)
{
    if( p == r )
    {
    return pt;
    }
    pair<typename List<Type>::Node *,int>qt;
    qt=partition(p,r,pt,rt);
    int k=(qt.second)-p+1;
    if( i == k )
    return qt.first;
    else if( i< k)
    return select(p,qt.second-1,i,pt,qt.first->pre);
    else
    return select(qt.second+1,r,i-k,qt.first->next,rt);
}
int main()
{
    srand(time(NULL));
    Rank<int> rank;
    for(int i=0;i<10;i++)
    {
    int key=rand()%50;
    rank.insert(key);
    }
    rank.walk();
    //std::cout<<rank.size()<<std::endl;
    //std::cout<<*(rank._rank_k(5))<<std::endl;
    rank.qsort();
    rank.walk();
    return 0;
}


[ 本帖最后由 Devil_W 于 2010-7-16 22:26 编辑 ]
2010-07-16 22:23
jmchang
Rank: 2
等 级:论坛游民
帖 子:16
专家分:66
注 册:2010-7-14
收藏
得分:5 
很难啊。不知道那里出现问题。

[url=http://www.]抛光蜡[/url]
2010-07-17 16:42
快速回复:这个链表的排序哪里有问题? sort函数有问题
数据加载中...
 
   



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

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