单链表排序(函数指针)

来源:互联网 发布:淘宝导航制作 编辑:程序博客网 时间:2024/06/05 03:48

问题描述:

用户输入数据,构成单链表,然后对单链表进行排序,能够随意切换排序的方法(列入升序降序)。

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

运行结果:

这里写图片描述