在書上傳錄下面的代碼,進行學習。
#include <studio.h>/*標頭檔*/<br />/*自訂資料類型 NODE, 用於表示每一個待排序的資料*/<br />typedef struct node<br />{<br />int data;<br />struct node *next;//下一個節點的指標<br />struct node *prev;//上一個節點的指標<br />} NODE;<br />/*插入新節點node至雙向鏈表 head中*/<br />insertLt(NODE *head, NODE *node)<br />{<br />/*鏈表為空白,以要插入的節點為前端節點*/<br />if (*head == NULL)/*第一個節點*/<br />{<br />(*head) = node;/*以新節點為鏈表頭*/<br />(*head)->next = NULL;/*後續節點為空白*/<br />(*head)->pre = NULL;/*前序節點為空白*/<br />} else {/*鏈表非空,將新加入的節點作為前端節點,插入鏈表的頭部*/<br />node->next = *head;/*新節點插入鏈表的頭部*/<br />(*head)->pre = node;<br />(*head) = node;<br />(*head)->pre = NULL;<br />}<br />}<br />/*一趟冒泡排序的函數,從鏈表的第一個節點開始比較,直到node節點結束*/<br />PerBubble(NODE *head, NODE *node)<br />{<br />NODE *tmp, *p;//臨時變數定義<br />int n;<br />for (tmp = head; tmp != node; tmp=tmp->next)//從第一個節點開始比較,到節點結束<br />{<br />if (tmp->next == NULL)break;<br />/*如果當前值大於後續節點的值,交換兩個節點*/<br />if (tmp->data > tmp->next->data)<br />{<br />n = tmp->data;<br />tmp->data = tmp->next->data;<br />tmp->next->data = n;<br />}<br />}<br />}<br />/*冒泡排序演算法函數 head為待排序的鏈表*/<br />BubbleSort(NODE *head)<br />{<br />NODE *tmp = NULL<br />for (tmp = head; tmp->next != NULL; )//尋找雙向鏈表的最後一個節點<br />tmp = tmp->next;<br />/*從最後一個節點開始,一直到第一個元素,分別進行一趟排序過程*/<br />for (; tmp != NULL; tmp = tmp->pre)<br />{<br />PerBubble(head, tmp);//調用排序函數<br />}<br />}<br />main()<br />{<br />int n;/*迴圈變數定義*/<br />NODE *head = NULL;/*鏈表的頭指標,初始化為空白*/<br />NODE *tmp, *p;/*指標變數,臨時儲存NODE變數的指標*/<br />for(;;;)/*迴圈調用從鍵盤輸入的資料,根據輸入的資料簡曆雙向鏈表,輸入負數則退出迴圈*/<br />{<br />scanf("%d", &n);//從標準輸入裝置輸入一個整數<br />if (n < 0) break;<br />tmp = (NODE *)malloc(sizeof(NODE));//動態申請記憶體<br />memset(tmp, 0x00, sizeof(tmp));//清空申請的記憶體<br />tmp->data = n;//儲存輸入的值<br />tmp->next = NULL;<br />tmp->pre = NULL;<br />insertLt(&head; tmp);<br />}<br />BubbleSort(head);<br />for (tmp = head; tmp != NULL; //迴圈輸出排序後的結果,同時釋放動態申請的記憶體變數<br />{<br />printf("%d/n", tmp->data);<br />p = tmp;<br />tmp = tmp->next;//跳轉至下一結點<br />p->next = NULL;<br />free(p);//釋放記憶體<br />}<br />}