题目描述
已知一个正整数组成的无序序列,个数未知,但至少有一个元素,你的任务是建立一个单链表,并使用该链表存储这个正整数序列,然后将这个链表进行排序,使得排序后的链表为递增序列。正整数的输入用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。在排序的过程中,你可以自己选择排序算法(冒泡排序、选择排序等),但必须是通过修改结点的指针域来进行排序,而不是对结点的数据域进行修改。程序结束后要释放所有节点占据的空间。
输入
一个元素个数未知的正整数序列,以输入“-1”结束,输入“-1”前至少输入一个正整数。
注:这里使用的是冒泡排序。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct link {
int data;
struct link* next;
}Link;
int main(void)
{
int a = 0,min = 100000000, i, count = 0;
Link* head, * ptr, *p, *p1;//head头指针
head = (Link*)malloc(sizeof(Link));//头节点
ptr = head;
head->next = NULL;
scanf("%d", &a);
getchar();
while (a != -1)//建立链表
{
ptr->next = (Link*)malloc(sizeof(Link));//在链表尾加一个节点
ptr = ptr->next;
ptr->data = a;
ptr->next = NULL;
scanf("%d", &a);
getchar();
count++;
}
for (i = 0; i < count; i++)//冒泡排序
{
p1 = head;
while (p1->next->next != NULL)
{
if (p1->next->data > p1->next->next->data)
{
Link* ptr1 = p1->next;
Link* ptr2 = p1->next->next;
p1->next = ptr2;
ptr1->next = ptr2->next;
ptr2->next = ptr1;
}
p1 = p1->next;
}
}printf("The new list is:");
for (ptr = head->next; ptr != NULL; ptr = ptr->next)
{
if (ptr->next == NULL)
printf("%d\n", ptr->data);
else printf("%d ", ptr->data);
}
p = head;
for (ptr = head->next; ptr != NULL; ptr = ptr->next)//释放空间
{
free(p);
p = ptr;
}
return 0;
}