| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 717 人关注过本帖
标题:把一个无序的单链表排序
只看楼主 加入收藏
wwqiu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2010-7-28
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:1 
把一个无序的单链表排序
程序代码:
#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;
      
    }
}
把一个无序的单链表排序,试好好久都不行,应该是最后一个函数sort问题,可以直接看最后一个函数,谢谢大家
搜索更多相关主题的帖子: 单链 
2010-08-26 14:19
S_12s
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:110
专家分:670
注 册:2010-7-21
收藏
得分:7 
对链表排序,如果要把整个结点都交换,那确实有点难,除非你一个一个结点比较,每次找出最大的一个,链到一个新的链表上。但如果只是交换结点里的数据,那就好办了,以下是排序代码(选择排序):
程序代码:
void sort(linklist head)
{
    listnode *p,*q;
    datatype r;
    p=head->next;
    while (p!=NULL)
    {
        q=p->next;
        while (q!=NULL)
        {
            if (q->data>p->data)
            {
                r=q->data;
                q->data=p->data;
                p->data=r;
            }
            q=q->next;
        }
        p=p->next;
    }
}


2010-08-26 22:35
快速回复:把一个无序的单链表排序
数据加载中...
 
   



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

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