刚写的链表的插入排序,排序部分能优化吗?
#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;
}