Tokenize arithmetic expression in C
Your is_operator function can be rewritten as
return token == '+' || token == '-' || token == '*' || token == '/' || token == '^';

Much cleaner, in my opinion.

The program has a memory leak. Your tokenize function allocates a struct token on the heap, but the object is never freed.
Better yet, instead of returning a struct token*, just return a struct token. The struct certainly isn't large enough to warrant an allocation on the heap.

Instead of checking whether token is an operand by comparing operator to 0, use an enum.
typedef enum { 
       TokenType_Operator, 
       TokenType_Operand 
} token_type;

Then your token struct can consist of the token_type enum, and an union.
struct token
{
   token_type type;
   union {
       char operator;
       float operand;
   } data;
};

If you're using C11, you don't even need to name the union anything.

As a next step, try to implement a tokenizer that tokenizes in one pass. Right now, your tokenizer 1) removes whitespace (which involves a linear pass) and 2) copies of the rest of the string after the tokenizing an operand into the original buffer. If you have a large buffer, this could become a bottleneck.
A common way to implement a tokenizer is using a DFA (deterministic finite automata). In fact, a DFA is a starting point for most handwritten lexers.