一道C语言中关于链表排序的代码的思路与步骤

输入5个数据,并排序,然后输出,用链表解决,代码如下:#include<stdio.h>#include<malloc.h>#defineLENsizeof(struct... 输入5个数据,并排序,然后输出,用链表解决,代码如下:
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof (struct number)

struct number
{
int num;
struct number *next;
};
int n=0,sum=0;
void main()
{
number *creat();
void print(number *head);
number *change(number *head);
number *ahead;
ahead=creat();
sum+=n;
change(ahead);
print(ahead);

}
number *creat()
{
number *p1,*p2,*head;

p1=p2=(number*)malloc(LEN);
printf("input a number,not zero\n");
scanf("%d",&p1->num);
while(p1->num!=0)
{
n++;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(number*)malloc(LEN);
scanf("%d",&p1->num);
}
p2->next =NULL;
return head;
}
number *change(number *head)
{
number *p,*h;
for(int i=1;i<sum;i++)
for(p=head,h=p->next;p->next!=NULL;p=p->next,h=h->next)
if(p->num>h->num)
{
int t;
t=p->num;p->num=h->num;h->num=t;
}
return head;
}
void print(number *head)
{
number *p;
p=head;
while(p!=NULL)
{
printf("%d",p->num );
p=p->next ;
}
}

请高手指点此段代码的思路,如果可以的话请帮忙写下注释,尽量详细一些,明天老师可能会问一些问题,谢谢~好的话还有加分~
展开
 我来答
jimmyc2006
推荐于2016-05-15 · TA获得超过1153个赞
知道小有建树答主
回答量:572
采纳率:100%
帮助的人:652万
展开全部
/*代码的整体思路是分为3个函数,一个建立链表,一个链表排序,最后一个是输出链表,
而程序调用也是根据这个顺序来调用的,详细说明在下面*/

#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct number)

struct number
{
int num;
struct number *next;
};
int n=0,sum=0;
void main()
{
struct number *creat();
void print(struct number *head);
struct number *change(struct number *head);
struct number *ahead;
ahead=creat();
sum+=n; //sum计算结点的总数
change(ahead);
print(ahead);
}
struct number *creat() //创建链表
{
struct number *p1,*p2,*head;
p1=p2=(struct number*)malloc(LEN); //LEN就是define定义的sizeof(struct number)
printf("input a number,not zero\n");
scanf("%d",&p1->num); //将p1的num赋值为输入的数
while(p1->num!=0) //如果输入的数不是0
{
n++; //是记录链表节点的数量
if(n==1) //如果n是建立的第一个结点,也就是链表的头
head=p1;
else //否则p2的next指针指向p1,也就是原来链表最后一个结点的next指向新结点p1
p2->next=p1;
p2=p1; //p2指向p1,每次p2都指向链表的结尾
p1=(struct number*)malloc(LEN); //申请内存,建立新结点
scanf("%d",&p1->num); //再输入号
}
p2->next =NULL; //将尾结点的next指针指向NULL
return head; //返回头指针
}
struct number *change(struct number *head)
{
struct number *p,*h;
int i;
for(i=1;i<n;i++) //sum此时为结点总数,我觉得这里写n就可以了,没必要sum这个变量
for(p=head,h=p->next;p->next!=NULL;p=p->next,h=h->next)
//p指向头结点,h指向p的后一个结点,每循环一次p和h都往后指一个结点
if(p->num>h->num) //如果前面的结点比后面结点大,就交换,只交换num的值
{
int t;
t=p->num;
p->num=h->num;
h->num=t;
}
return head;
}
void print(struct number *head) //链表的便利,只便利num值
{
struct number *p;
p=head;
while(p!=NULL)
{
printf("%d",p->num );
p=p->next ;
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式