| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 526 人关注过本帖
标题:刚写的链表的插入排序,排序部分能优化吗?
只看楼主 加入收藏
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
结帖率:58.18%
收藏
已结贴  问题点数:20 回复次数:2 
刚写的链表的插入排序,排序部分能优化吗?
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    struct node
    {
        int data;
        struct node *next;
    };

    int i,n,a;
    int temp;
    struct node *head,*q,*p;
    struct node *t;

    head=NULL;    //初始化头结点,使其指向空
    printf("请输入数据个数:");
    scanf("%d",&n);
    printf("\n");

    printf("请输入数据");

    for(i=1;i<=n;i++)
    {   
        p=(struct node *)malloc(sizeof(struct node));//建立新结点,并使P指针指向新结点
        scanf("%d",&a);
        p->data=a;      //将数据存储到当前结点的data域
        p->next=NULL;   //设定新结点后继指针指向空,在链表建立完成之后最新结点必然指向NULL

        if(head==NULL)  //如果当前的结点为第一个结点,则将头指针指向它
            head=p;
        else
            q->next=p;    //如果当前的结点不为第一个结点,则将当前结点的上一个结点的后继指针指向它。

        q=p;            //q指向当前结点
    }
    printf("\n");

    printf("输出原数据:\n");
    t=head;
    while(t!=NULL)
    {
        printf("%d",t->data);
        t=t->next;        //指向下一个结点
    }
     printf("\n");

    //冒泡排序
   
    t=head;
    for(i=1;i<=n;i++)
    {
        while(t->next!=NULL)
        {
            if((t->data)>(t->next->data))
            {temp=t->data;t->data=t->next->data;t->next->data=temp;}
            t=t->next;
        }
        t=head;//从头开始遍历
    }

    printf("输出排序后的数据:\n");
    t=head;
    while(t!=NULL)
    {
        printf("%d",t->data);
        t=t->next;        //指向下一个结点
    }
    printf("\n");

    //插入数据
    printf("请输入插入的数据:");
    scanf("%d",&a);
    printf("\n");

    t=head;
    p=(struct node *)malloc(sizeof(struct node));   //新建结点,并为其开辟空间
    p->data=a;   //将数据保存在新结点data域中
   
    while(t!=NULL)
    {
        if((t->next->data)>(p->data))
        {
            p->next=t->next;    //新结点后继指针指向当前结点后继指针
            t->next=p;            //当前结点后继指针指向新建结点
            break;                //插入数据后结束遍历
        }
        t=t->next;                //继续下一个结点
    }


    printf("输出插入后的数据:\n");
    t=head;
    while(t!=NULL)
    {
        printf("%d",t->data);
        t=t->next;        //指向下一个结点
    }
    printf("\n");
    return 0;

}
搜索更多相关主题的帖子: include 
2015-07-18 11:51
rolimi
Rank: 4
等 级:业余侠客
威 望:1
帖 子:43
专家分:232
注 册:2015-6-10
收藏
得分:20 
程序代码:
//冒泡排序
    
    t=head;
    struct node *pe = NULL;
    for(i=1;i<=n;i++)
    {
        while(t->next!=pe)
        {
            if((t->data)>(t->next->data))
            {temp=t->data;t->data=t->next->data;t->next->data=temp;}
            t=t->next;
        }
        pe = t;
        t=head;//从头开始遍历
    }

ps:外面的for可以用while(pe != head)代替
insert时是有问题的,比如插入一个比链表所有节点都大的值时,当t是最后一个节点,t->next->data会出错

呆呆的逗比程序猿
2015-07-18 15:27
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 2楼 rolimi
你一说我才注意到呢,明天改
2015-07-18 20:14
快速回复:刚写的链表的插入排序,排序部分能优化吗?
数据加载中...
 
   



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

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