1. 程式人生 > >單鏈表排序(函式指標)

單鏈表排序(函式指標)

問題描述:

使用者輸入資料,構成單鏈表,然後對單鏈表進行排序,能夠隨意切換排序的方法(列入升序降序)。

PS:

要隨意切換排序的方法,那麼使用函式指標作為引數傳入到排序函式中,那麼函式指標指向的函式就可以方便的制定排序規則了。

參考程式碼:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <malloc.h>

struct LinkList
{
    int nData;
    LinkList *pNext;
};

LinkList* head;

void MySwap(int
*p1, int *p2) { if (NULL == p1 || NULL == p2) return; int temp = *p1; *p1 = *p2; *p2 = temp; } void MySwap(char *p1, char *p2) { if (NULL == p1 || NULL == p2) return; char temp[50] = { 0 }; strcpy(temp, p1); strcpy(p1, p2); strcpy(p2, temp); } void MySwap(LinkList *p1
, LinkList *p2) { MySwap(&p1->nData, &p2->nData); } int CmpAscend(LinkList *p1, LinkList *p2) { return p1->nData > p2->nData; } int CmdDescend(LinkList *p1, LinkList *p2) { return p1->nData < p2->nData; } void SoftLinkList(int(*CMP)(LinkList *p1, LinkList *p2
)) { LinkList *p = NULL; LinkList *q = NULL; for (p = head->pNext; p->pNext != NULL; p = p->pNext) { for (q = p->pNext; q != NULL; q = q->pNext) { if (CMP(p, q)) { MySwap(p, q); } } } } void InitLinkList() { head = (LinkList*)malloc(sizeof(LinkList)); head->nData = 0; head->pNext = NULL; int i, n, num; LinkList *p = head, *s = NULL; printf("輸入連結串列元素個數: "); scanf("%d", &n); printf("輸入 %d 個元素,用空格分隔\n", n); for (i = 0; i < n; i++) { scanf("%d", &num); s = (LinkList *)malloc(sizeof(LinkList)); s->nData = num; s->pNext = NULL; p->pNext = s; p = s; } } void PrintLinkList() { printf("************************************************************************\n"); LinkList *p = head->pNext; while (p) { printf("%d---->", p->nData); p = p->pNext; } printf("NULL\n"); printf("************************************************************************\n\n"); } int main() { InitLinkList(); printf("初始連結串列序列\n"); PrintLinkList(); printf("連結串列升序排序\n"); SoftLinkList(CmpAscend); PrintLinkList(); printf("連結串列降序排序\n"); SoftLinkList(CmdDescend); PrintLinkList(); return 0; }

執行結果:

這裡寫圖片描述