2210: 链表排列(线性表)
时间限制: 1 Sec 内存限制: 128 MB提交: 61 解决: 30
[提交][状态][讨论版][命题人:外部导入]
题目描述
(线性表)已知不带头结点的线性链表list,链表中结点构造为(data、link),其中data为数据域,link为指针域。请写一算法,将该链表按结点数据域的值的大小从小到大重新链接。要求链接过程中不得使用除该链表以外的任何链结点空间。
输入
m=5
3 1 5 4 6
输出
1 3 4 5 6
样例输入
m=8
10 1 5 14 32 55 67 6
样例输出
1 5 6 10 14 32 55 67
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node *next;
}list;
int a[100];
list *createList(int m, int a[])
{
int i;
list *p, *r, *L;
L = (list *)malloc(sizeof(list));
r = L;
for(i = 0; i < m; ++i)
{
p = (list *)malloc(sizeof(list));
p->data = a[i];
r->next = p;
r = p;
}
r->next = NULL; //问题的关键
return L;
}
int main()
{
int m, i, temp;
list *L, *p, *q;
scanf("m=%d", &m);
for(i = 0; i < m; ++i)
scanf("%d", &a[i]);
L = createList(m, a);
for(p = L->next; p != NULL; p = p->next)
{
for(q = p->next; q != NULL; q = q->next)
{
if(p->data > q->data)
{
temp = q->data;
q->data = p->data;
p->data = temp;
}
}
}
for(p = L->next; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
return 0;
}