1. 程式人生 > >演算法與資料結構-單向連結串列的直接插入排序和快速排序

演算法與資料結構-單向連結串列的直接插入排序和快速排序

#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; }