要求說明
輸入一組數,構建有序鏈表。
整體思路
用數組保存這組數,每次都去找最小值,把最小值構建結點並使用頭插法插入到單鏈表中。 然後將該值刪掉(爲簡便起見,把值弄成MAX)。
這裏使用的是類直接插入的排序方法。
代碼實現
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
// 單鏈表結構體定義
typedef struct node
{
int val;
struct node *next;
} node;
// 順序打印鏈表
void printNode(node* L)
{
while(L->next!=NULL)
{
L = L->next;
printf("%d ",L->val);
}
}
int main()
{
int n,i,j;
//因爲要求有序,所以每次都去數組中找最小的值
int min=MAX;
int min_index = -1;
int arr[100];
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&arr[i]);
}
// 表頭結點head 和 需要插入的結點s
node *head,*s;
// 生成表頭結點,表頭結點不存放數據
head = (node*)malloc(sizeof(node));
head->next = NULL;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(min>arr[j])
{
min = arr[j];
min_index = j;
}
}
// 頭插法構建單鏈表
s = (node*)malloc(sizeof(node));
s->val = min;
s->next = head->next;
head->next = s;
// 初始化最小值標識
arr[min_index] =MAX;
min = MAX;
}
// 輸出單鏈表
printNode(head);
return 0;
}
運行結果
由於我們每次都是找最小值,故是從小到大的順序插入。
而我們使用的是頭插法,故最終結果從大到小。
所以如果想要讓最終的單鏈表從小到大,每次都找最大值即可。
10
1 9 5 4 3 2 1 5 8 6
9 8 6 5 5 4 3 2 1 1