Structures are used to hold data relating to a central idea, ie several variables/data types together to make an "object".

Here is a quick/simple example that shows how to use a structure and how it could be useful for dealing with data that relates to each other:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct employee {
    char * name;
    char * department;
    double salary;
    struct employee * boss; /* pointer to this employees boss */
};

struct employee * newEmployee(char *,char *,double);
void removeEmployee(struct employee *);
void setEmployeeBoss(struct employee *,struct employee *);
void printEmployee(struct employee *);

int main(void)
{
    struct employee * stan;
    struct employee * BossMan;

    stan = newEmployee("Stan the Man","Mailroom",50);
    BossMan = newEmployee("Mr. Boss","Executive",300);
    setEmployeeBoss(stan,BossMan);

    printEmployee(stan);
    putchar('\n');
    printEmployee(BossMan);

    /* clean up */
    removeEmployee(BossMan);
    removeEmployee(stan);

    return 0;
}

/* allocate and return pointer to a new employee */
struct employee * newEmployee(char * name, char * dept, double sal)
{
    struct employee * emp = NULL;

    if (emp = malloc(sizeof *emp)) {
        if (name && dept) {
            emp->name = malloc(strlen(name)+1);
            emp->department = malloc(strlen(dept)+1);
            if (emp->name) strcpy(emp->name,name);
            if (emp->department) strcpy(emp->department,dept);
            emp->salary = sal;
            emp->boss = NULL;
        }
    }

    return emp;
}

/* deallocate memory pointed to by an employee pointer */
void removeEmployee(struct employee * emp)
{
    if (emp) {
        free(emp->name);
        free(emp->department);
        free(emp);
    }
}
/* set the employee boss pointer */
void setEmployeeBoss(struct employee * emp, struct employee * boss)
{
    /* allows setting boss to NULL */
    if (emp)
        emp->boss = boss;
}

/* print out contents of employee struct */
void printEmployee(struct employee * emp)
{
    if (emp)
        printf("%-15s%s\n%-15s%s\n%-15s$%.2lf/hr\n",
                "Name:",emp->name,"Department:",emp->department,
                "Salary:",emp->salary);
    if (emp->boss)
        printf("%-15s%s\n","Boss:",emp->boss->name);
}
Of course you dont necessarily have to use seperate functions to access the data within the struct, you can access it directly once you have a pointer to the struct. However the whole idea of "data hiding" is lost if you allow direct access to the struct.

This way users can you use your struct "interface" without knowing whats actually in the structure.