演算法與資料結構-單向連結串列的直接插入排序和快速排序
阿新 • • 發佈:2019-02-15
#include <stdio.h>
#include <stdlib.h>
//單向連結串列定義
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
typedef LNode *LinkList;
//函式宣告
LinkList CreatLink(int num);
LinkList LinkInsertSort(LinkList head);
void PrintLink(LinkList head);
/* 連結串列建立 */
LinkList CreatLink(int num)
{
int data ;
//p指向當前連結串列中最後一個結點,q指向準備插入的結點。
LinkList head = NULL, rearNode = NULL, newNode;
for (int i = 0; i < num; i++)
{
scanf("%d", &data);
newNode = (LinkList)malloc(sizeof(LNode));
newNode -> data = data;
newNode -> next = NULL;
if (i == 0) //頭結點
{
head = newNode;
}
else
{
rearNode -> next = newNode;
}
rearNode = newNode;
}
return head;
}
/*************************************
功能: 直接插入排序
陣列直接插入排序:待排序陣列 + 排序後陣列
連結串列直接插入排序:待排序連結串列 + 排序後連結串列
***************************************/
LinkList LinkInsertSort(LinkList head)
{
LinkList originList, nodeScan, preNode, newNode;
if (head == NULL)
return head;
//分離原連結串列為有序和無序連結串列
originList = head -> next;
//有序連結串列的第一個節點L指向節點
head -> next = NULL;
//遍歷無序連結串列
while (originList)
{
newNode = originList;
originList = originList -> next;
preNode = NULL;
//尋找元素插入位置
for (nodeScan = head; (nodeScan != NULL) && (nodeScan -> data < newNode -> data); preNode = nodeScan, nodeScan = nodeScan -> next);
//迴圈退出表示查詢到節點插入的位置
if (nodeScan == head)
head = newNode;
else
preNode -> next = newNode;
newNode -> next = nodeScan;
}
return head;
}
/* 連結串列輸出函式 */
void PrintLink(LinkList head)
{
LinkList nodeScan;
for (nodeScan = head; nodeScan ;nodeScan = nodeScan->next)
{
printf("%-3d ", nodeScan->data);
}
}
int main()
{
LinkList head;
int listLen;
printf("輸入連結串列節點個數:\n");
scanf("%d", &listLen);
printf("輸入元素值:\n");
head = CreatLink(listLen);
head = LinkInsertSort(head);
printf("排序後:\n");
PrintLink(head);
putchar('\n');
return 0;
}