| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1617 人关注过本帖
标题:把一个无序单链表排序,有的问题
只看楼主 加入收藏
wwqiu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2010-7-28
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:6 
把一个无序单链表排序,有的问题
把一个无序的单链表排序,变成递增,但是看了好久都不行啊,感觉应该是最后一个函数sort(代码的最后一个子函数)写得有问题,希望能改一下
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int datatype;
typedef struct node
{
    datatype data;
    struct node *next;
}listnode,*linklist;
void main()
{
    void init(linklist *head);
    int insert(linklist head,int i,datatype e);
    void display(linklist head);
    void sort(linklist head);
    datatype a[]={66,2,4,1,86,77,356,7};
    int i;
    linklist L;
    init(&L);
    for(i=1;i<=sizeof(a)/sizeof(a[0]);i++)
        if(insert(L,i,a[i-1])==0)
            return;
    printf("排序前的链表元素为:\n");
    display(L);
    sort(L);
    printf("排序后链表元素为:\n");
    display(L);
}

void init(linklist *head)
{
    if((*head=(linklist)malloc(sizeof(listnode)))==NULL)
        exit(-1);
    (*head)->next=NULL;
}

int insert(linklist head,int i,datatype e)
{
    listnode *p,*pre;
    int j;
    pre=head;
    j=0;
    while(pre->next!=NULL&&j<i-1)
    {
        pre=pre->next;
        j++;
    }
    if(j!=i-1)
        return;
    if((p=(linklist)malloc(sizeof(listnode)))==NULL)
        exit(-1);
    p->data=e;
    p->next=pre->next;
    pre->next=p;
    return 1;
}

void display(linklist head)
{
    listnode *p;
    p=head->next;
    while(p)
    {
        printf("%4d",p->data);
        p=p->next;
    }
    printf("\n");
}

void sort(linklist head)
/*排序*/
{
    listnode *p,*q,*t,*s;
    p=head->next;/*p指向第一个结点,q指向第二个结点,然后使第一个结点和头结果在链表中断开*/
    q=p->next;
    p->next=NULL;
    while(q->next!=NULL)
    {
        s=head->next;
        t=q->next;/*t指向准备插入结点的下一个结点*/
        while(s&&q->data>s->data)
        {
            p=s;
            s=s->next;/*找到插入位置,p指向插入位置的前一结点*/
        }
       
           
            q->next=p->next;/*把结点到适合位置插入*/
            p->next=q;
            q=t;
       
    }
}


   
    


搜索更多相关主题的帖子: 单链 
2010-08-25 22:06
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
收藏
得分:0 
直接交换节点上的数据值不好吗?
2010-08-26 18:09
wwqiu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2010-7-28
收藏
得分:0 
我没想过啊,能给出代码吗,谢谢
2010-08-26 18:52
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
那样子是不好的, 不然 就没有必要采用什么链表的形式, 若果数据成员多的话 就可以显示出优点来
2010-08-27 08:40
wwqiu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2010-7-28
收藏
得分:0 
那我原来的代码哪里错了,可以帮我指出来吗
2010-08-27 09:26
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:10 
void sort(linklist &head)
/*排序*/
{/*
    listnode *p,*q,*t,*s;
    p=head->next;/*p指向第一个结点,q指向第二个结点,然后使第一个结点和头结果在链表中断开
    q=p->next;
    p->next=NULL;
    while(q->next!=NULL)
    {
        s=head->next;
        t=q->next;/*t指向准备插入结点的下一个结点
        while(s&&q->data>s->data)
        {
            p=s;
            s=s->next;/*找到插入位置,p指向插入位置的前一结点
        }         
        q->next=p->next;/*把结点到适合位置插入
        p->next=q;
        q=t;   
    }*/
    linklist d, p = head->next, fd, temp = head->next;

    if( !p || !p->next )
        return;
    while( temp )
    {
        d = p = temp;
        fd = head;
        while( p )
        {
            if(  p->data > d->data )
                d = p;
            p = p->next;
        }
        while( fd->next != d )
            fd = fd->next;
        if( d == temp )
            temp = temp->next;
        fd->next = d->next;
        d->next = head->next;
        head->next = d;
        
    }

}
2010-08-27 12:14
stupidfishsj
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2010-10-25
收藏
得分:0 
你的这个问题简单 只要交换节点的数据即可 下面你看一下 我实现了
void sort(linklist head)
/*排序*/
{
    listnode *p,*q;
    for(p=head->next;p!=NULL;p=p->next)
        for(q=p->next;q!=NULL;q=q->next)
            if(p->data>q->data)
                swap(p->data,q->data);
}
void swap(int &a,int &b)
{
    int tmp=a;
    a=b;
    b=tmp;
}
2010-10-25 14:06
快速回复:把一个无序单链表排序,有的问题
数据加载中...
 
   



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

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