單鏈表排序(函式指標)
阿新 • • 發佈:2018-12-21
問題描述:
使用者輸入資料,構成單鏈表,然後對單鏈表進行排序,能夠隨意切換排序的方法(列入升序降序)。
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;
}
執行結果: