Summarizing calories for a food diary
Reducing repetition
The big if statement in printAvgCalPerGroup is a bit repetitive (as you pointed out).  Imagine if you increased the number of food groups.  You would have to copy/paste 4 places for each food group you added.
First, I would suggest using arrays for the counts and amounts of each foodgroup.  Then you only have to convert the letter such as 'v' into an array index.
Second, if the food groups could possibly change, I would suggest using an enum to keep track of them.  This is definitely optional, and you could use hardcoded numbers instead (e.g. 'v' -&gt; 0, 'm' -&gt; 1, etc).
Third, a small change to make would be to track the amounts using ints instead of doubles, since the amounts always increase by 1 only.
Here is what your code would look like using arrays and enums:
typedef enum FoodGroup {
    VEG,
    MEAT,
    DAIRY,
    GRAINS,
    FAT,
    FOODGROUP_MAX
} FoodGroup;

void printAvgCalPerGroup(Food * list)
{
    double    count[FOODGROUP_MAX] = {0};
    int       amnt [FOODGROUP_MAX] = {0};
    FoodGroup group;

    Food * temp = list;

    while (temp!= NULL) {
        switch (temp-&gt;foodGroup[0]) {
            case 'v': group = VEG;           break;
            case 'm': group = MEAT;          break;
            case 'd': group = DAIRY;         break;
            case 'g': group = GRAINS;        break;
            case 'f': group = FAT;           break;
            default : group = FOODGROUP_MAX; break;
        }
        if (group &lt; FOODGROUP_MAX) {
            amnt [group]++;
            count[group] += temp-&gt;calories;
        }
        temp = temp-&gt;next;
    }

    for(group=0; group&lt;FOODGROUP_MAX; group++)
        printf(&quot;%.2f\n&quot;, calcAvg(count[group], amnt[group]));
}

If you don't need the enum, just replace VEG with 0, MEAT with 1, etc.