JavaEar 专注于收集分享传播有价值的技术资料

C Error: expression must have arithmetic or pointer type

typedef struct node
{
    Record data;
    struct node *next;
}Node;

Node *head = NULL;

void addRecord(Record x)
{
    Node *previousNode = NULL;
    Node *newNode;
    Node *n;

newNode = (Node*)malloc(sizeof(Node));
newNode->data = x;
newNode->next = NULL;

if (head == NULL)  // The list is empty
{
    head = newNode;
}
else       // The list is not empty
{
    n = head;
    while (n->next != NULL)
    {
        ***if (n->data < newNode->data && n->next->data > newNode->data)*** // Insertion Sort
        {
            // We have to put it between these 2 nodes
            newNode->next = n->next;
            n->next = newNode;
            return;
        }
        else
        {
            previousNode = n;
            n = n->next;
        }
    }
    n->next = newNode;
}

}

I have this error in the code within the if function of the insertion sort. The program says that 'n' must have arithmetic or pointer type. What seems to be the problem?

1个回答

    最佳答案
  1. Operator overload is not supported in C, so you cannot compare Record using > operator unless it is typedefed to int or other aritimetic or pointer type.

    To compare something like structures, define comparation function and use it.

    Example:

    typedef struct {
        int a, b;
    } Record;
    
    /*
    return positive value if *x > *y
    return negative value if *x < *y
    return 0 if *x == *y
    */
    int cmpRecord(const Record* x, const Record* y) {
        if (x->a + x->b > y->a + y->b) return 1;
        if (x->a + x->b < y->a + y->b) return -1;
        return 0;
    }
    
    /* ... */
        while (n->next != NULL)
        {
           if (cmpRecord(&n->data, &newNode->data) < 0 && cmpRecord(&n->next->data, &newNode->data) > 0) // Insertion Sort
            {
    /* ... */