读书人

求队列数据结构函数含义解释,该怎么

发布时间: 2012-03-09 21:42:54 作者: rapoo

求队列数据结构,函数含义解释

这个函数pqueue_sort_key(Pqueue pq1, Pqueue pq2)
到底是怎样进行排序的啊,是什么意思,求教?


C/C++ code
/*排序队列通过key*/voidpqueue_sort_key(Pqueue pq1, Pqueue pq2){    int k, j;    for (k = 1; k <= pq1->count; k++) {        /* 查找键*/        if (pq1->key[k] != pq2->key[k]) {            /*不对应*/            for (j = 1; j <= pq2->count; j++) {                /*查找那个正确的*/                if (pq1->key[k] == pq2->key[j]) {                    /* 找到! */                    swap(&pq2->h[k], &pq2->h[j]);                    swap(&pq2->key[k], &pq2->key[j]);                }            }        }    }}





在数据结构整个定义里
C/C++ code
/*优先级队列定义*/#include <stdio.h>#include <stdlib.h>#include "item.h"#include "pqueue.h"typedef Item *Heap;struct pqueue {    Heap h;    int *key;    int size, count;};/*执行交换信息*/static voidswap(int *i, int *j){    int tmp;    tmp = *i;    *i = *j;    *j = tmp;}/*返回父节点的键*/static intfather(Pqueue pq, int i){    if (pq == NULL) {        fprintf(stderr, "father(): non esiste una coda\n");        return (-1);    }            if (i >= 2 && i <= pq->count) {        return (i / 2);    }        return (i);}/*创建新队列*/Pqueuepqueue_new(int n){    Pqueue pq;    int i;    if (n == 0) {        exit(EXIT_SUCCESS);    }    if ((pq = malloc(sizeof(struct pqueue))) == NULL) {        fprintf(stderr, "Error: malloc()\n");        exit(EXIT_FAILURE);    }    if ((pq->h = malloc((n + 1) * sizeof(Item))) == NULL) {        fprintf(stderr, "Error: malloc()\n");        exit(EXIT_FAILURE);    }    if ((pq->key = malloc((n + 1) * sizeof(Item))) == NULL) {        fprintf(stderr, "Error: malloc()\n");        exit(EXIT_FAILURE);    }    for (i = 0; i < (n + 1); i++) {        pq->h[i] = 0;        pq->key[i] = i;    }    pq->size = (n + 1);    pq->count = 0;    return (pq);}/*向队列里插入新值,自动调整其,符合堆的定义*/voidpqueue_insert(Pqueue pq, Item item){    int pos;    if (pq == NULL) {        fprintf(stderr, "pqueue_insert(): non esiste una coda\n");        return;    }    pos = (pq->count + 1);    if (pos < pq->size) {        /* Imposta valore */        pq->h[pos] = item;                pq->count++;        heapify_up(pq, pos);    } else {        fprintf(stderr, "pqueue_insert(): coda piena\n");        return;    }}/*从上往下调整其为堆*/static voidheapify_up(Pqueue pq, int i){    int j;    if (pq == NULL) {        fprintf(stderr, "heapify_up(): non esiste una coda\n");        return;    }    if (i > 1) {        j = father(pq, i);        if (cmp(pq->h[i], pq->h[j]) < 0) {            swap(&(pq->h[i]), &(pq->h[j]));            swap(&(pq->key[i]), &(pq->key[j]));            heapify_up(pq, j);        }    }}


[解决办法]
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
pq2: 11, 24, 13, 33, 11, 15, 23, 35, 16, 29, 7, 26

首先 pq1的第一个key和pq2的第一个key进行比较,pq1的key是5,pq2的key是1,不相等。从pq2的key中查找与5相等的key,结果pq2中第五个key等于5,所以就把pq2中的第一项与pq2中的第五项互相交换,结果如下:
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 5, 2, 3, 4, 1, 6, 7, 8, 9, 10, 11, 12
pq2: 11, 24, 13, 33, 11, 15, 23, 35, 16, 29, 7, 26

然后第二次循环 pq1的第二个key和pq2的第二个key进行比较,pq1的key是11,pq2的key是2,不相等。从pq2的key中查找与11相等的key,结果pq2中第11个key等于11,所以就把pq2中的第二项与pq2中的第11项互相交换,结果如下:
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12


pq2的Key是: 5, 1, 3, 4, 1, 6, 7, 8, 9, 10, 2, 12
pq2: 11, 7, 13, 33, 11, 15, 23, 35, 16, 29, 24, 26

然后第三次循环 pq1的第3个key和pq2的第3个key进行比较,pq1的key是9,pq2的key是3,不相等。从pq2的key中查找与9相等的key,结果pq2中第9个key等于9,所以就把pq2中的第三项与pq2中的第九项互相交换,结果如下:
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 5, 1, 9, 4, 1, 6, 7, 8, 3, 10, 2, 12
pq2: 11, 7, 16, 33, 11, 15, 23, 35, 13, 29, 24, 26

然后第四次循环 pq1的第4个key和pq2的第4个key进行比较,pq1的key是3,pq2的key是4,不相等。从pq2的key中查找与3相等的key,结果pq2中第9个key等于3,所以就把pq2中的第四项与pq2中的第九项互相交换,结果如下:
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 5, 1, 9, 3, 1, 6, 7, 8, 4, 10, 2, 12
pq2: 11, 7, 16, 13, 11, 15, 23, 35, 33, 29, 24, 26

现在已经经历四次循环了,然后继续循环,按照上面的方法进行排序,就得到上面的结果了。

读书人网 >C语言

热点推荐