文字列をデータとする連結リストをメモリ上に構築するプログラムを作っています。
連結リストを初期化する関数
struct cell * list_init(void)
{
	struct cell * p;
	if((p=malloc(sizeof(struct cell))) == NULL )
		return NULL;
	p->next=NULL;
	strcpy(p->data, Dummy!!);
	return p;
}
連結リストへ要素を挿入する関数
struct cell * list_init(void)
{
	struct cell * p;
	if((p=malloc(sizeof(struct cell))) == NULL )
		return NULL;
	p->next=NULL;
	strcpy(p->data, Dummy!!);
	return p;
}
を用いて
1.キーボードから入力した文字列を連結リストとしてメモリ上に記憶する。
  (記憶順序は不問)
  確認のため入力が終わった時点で全記憶内容を画面に出力する。 
2.キーボードから入力した文字列を連結リストとしてメモリ上に記憶する。 
  (入力順に記憶する:全部出力した時に、入力順に出てくる)  
   確認のため入力が終わった時点で全記憶内容を画面に出力する。
というものですが、以下のプログラムだとうまく動作しないんで、どこを変えればいいのか教えて下さい。
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
struct cell{
	char data[21];
	struct cell *next;
};
struct cell *list_init(void);
void list_ins(struct cell *x, struct cell *p);
#define FALSE 0
#define TRUE !FALSE
#define NULL    ((void *)0)
void main (void)
{
	struct cell *h;
	struct cell *p;
	struct cell *x;
	int flge;
	char *data;
	p=list_init();
	h->next=p;
	flge=TRUE;
	while(flge){
		printf(data?);
		scanf(%s,&data);
		if(strcmp(data,end)==0){
			flge=FALSE;
			printf(END!\n);
			break;
		}
		x=p;
		if((p=malloc(sizeof(struct cell)))==NULL){
			printf(err!\n);
			break;
		}
		strcpy(p->data,data);
		list_ins(x,p);
		printf(OK!\n);
	}
}
struct cell * list_init(void)
{
        struct cell * p;
        if((p=malloc(sizeof(struct cell))) == NULL )
                return NULL;
        p->next=NULL;
        strcpy(p->data, Dummy!!);
        return p;
}
void list_ins(struct cell *x, struct cell *p)
{
        p->next = x->next;
        x->next = p;
}
はじめまして、キョーヤといいます。
解決法というわけではありませんが・・・。ポインタに関して多々間違いがあるようです。
ポインタを宣言した場合、メモリ上に確保されるのはあくまでデータを指す4BYTE長の
ポインタ変数(2BYTEというのもあると聞いたことがありますが)のみです。
main関数内の
h->next=p;
なんかは、hの実体が存在していません。コンピュータは素直にhにデフォルト入って
いるよくわからない数値がcell構造体を指すアドレスと信じてアクセスして、止まってし
まいます。
ポインタの解説をしだすととんでもないことになるので、このあたりは入門書や入門ホー
ムページで勉強してみてください。

 
  
  
  
  