如何优先排序字符?

时间:2014-05-25 16:14:20

标签: c sorting data-structures

我编辑了我的问题。我写了我的功能。但是输出中存在一些错误。我该如何修复它?

void enqueue(char type,int p){
 if (que == NULL){
    que =malloc(sizeof(struct node));
    que->nextPtr = NULL;
    que->pages=p;
    que->userType=type;
    return;
}
q = prev = que;

while((q->nextPtr != NULL) && charcmp(q->userType,type)<0){
    prev = q;
    q = q->nextPtr;
}
if(charcmp(q->userType,type)==0){
    while(q->nextPtr !=NULL && q->pages < p){
         prev = q;
         q = q->nextPtr;    
    } 
}

n = malloc(sizeof(struct node));
n->pages=p;
n->userType=type;

if ( (charcmp(q->userType,type) < 0 || charcmp(q->userType,type)==0 ) && q->pages < p){
    n->nextPtr = q->nextPtr;
    q->nextPtr = n;
}
if((q->pages >= p )){
    n->nextPtr = q;
    if (prev->nextPtr == q){
        prev->nextPtr = n;
    }
    else if (que == q)
    {
        que = n;
    }
}   

}

这是我的charcmp函数。

int charcmp(char a,char b){
while(a==b){
    return 0;
}

while(a!=b){

if(a=='C' && (b=='G'|| b=='A')){
    return -1;
}

if(a=='G' && (b=='A')){
    return -1;
}

if(a=='A' && (b=='C' || b=='G')){
    return 1;
}
if(a=='G' && b=='C'){
    return 1;
}
}
 }

我的输出有一些错误。我无法修复它。例如它的返回C,C,A,C,G

2 个答案:

答案 0 :(得分:0)

#include <stdio.h>

int main(){

    char inputChar[] = {'A', 'C', 'G'};
    char bufferChar[3] = {'\0', '\0', '\0'};

    for(int i = 0; i < 3; i++)
    {
        if(inputChar[i] == 'C')
            bufferChar[0] = inputChar[i];
        else if(inputChar[i] == 'G')
            bufferChar[1] = inputChar[i];
        else
            bufferChar[2] = inputChar[i];
    }

    for(int i = 0; i < 3; i++)
    {
        printf("%c ", bufferChar[i]);
    }
    printf("\n");
    return 0;
}

我希望这就是你要找的东西。尝试摆弄 inputChar 你仍然会得到C G A

答案 1 :(得分:0)

因此,您希望对自定义对象数组进行排序,如下所示:

typedef struct {
    char c;  // a character
    int i;   // a number
} pair;

然后您可以使用自定义比较函数应用标准函数qsort(),如下所示:

int compare(const void *a, const void *b) {
    pair *p1 = (pair*) a;
    pair *p2 = (pair*) b;
    if (p1->c == p2->c) return p1->i - p2->i;
    if (p1->c == 'C' || p1->c == 'G' && p2->c == 'A') return -1;
    return 1;
}

这样,包含测试数据的测试代码将打印C,1 C,8 G,2 G,5 A,4 A,7 A,10

int main() {
    pair input[] = {{'A', 10}, {'A', 7}, {'G', 5},
                    {'C', 8}, {'A', 4}, {'C', 1}, {'G', 2}};
    qsort(input, 7, sizeof(pair), compare);
    pair *cur = input;
    for (int i=0; i<7; ++i, ++cur) {
        printf("%c,%d ", cur->c, cur->i);
    }
    printf("\n");
}

如何将任意输入转换为结构数组,这是一个练习。