C语言链表的数据结构

想要定义一个数据结构的链表,请问怎样用纯C语言达到输入和输出的效果,另外请看看我的代码有什么错
代码如下:
#include
#include
typedef struct lnode{
struct lnode *next;
int data;
}Lnode;
void createlist(Lnode *header)
{
header=(Lnode *) malloc(sizeof (Lnode));
header->next=NULL;
int data;
Lnode *p,*q;
p=header;
while (1)
{
scanf("%d",&data);
if(data==999)
break;
q=(Lnode *) malloc(sizeof(Lnode));
q->next=NULL;
p->next=q;
p=q;

}

}
void printlist(Lnode *header)
{
Lnode *p;
p=header->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
}
void main()
{
Lnode header;
printf("输入:");
createlist(&header);
printf("输出:");
printlist(&header);
}

改动处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
typedef struct lnode {
    struct lnode* next;
    int data;
}Lnode;
void createlist(Lnode* header)
{
    //header = (Lnode*)malloc(sizeof(Lnode));修改
    //链表头结点已定义了,这里就不需要动态生成了。
    header->next = NULL;                  
    int data;
    Lnode* p, * q;
    p = header;
    while (1)
    {
        scanf("%d", &data);
        if (data == 999)
            break;
        q = (Lnode*)malloc(sizeof(Lnode));
        q->next = NULL;
        q->data = data;  //修改
        p->next = q;
        p = q;

    }
}
void printlist(Lnode* header)
{
    Lnode* p;
    p = header->next;
    while (p)
    {
        printf(" %d", p->data);
        p = p->next;
    }
}
void main()
{
    Lnode header; //定义了结构体变量,生成了链表头结点
    printf("输入:");
    createlist(&header);
    printf("输出:");
    printlist(&header);
}

while (1)是死循环呀
你先别忙搞链表,你换成数组先搞定输入什么时候能停下来的问题再说吧
链表不过是换了个形式,它跟数组没有本质区别