各位,本人对下面的代码总是改不对,不知道如何让它正常运行起来,特别是那个函数:List_list它的有关问题出在哪,或者是没有有关问题

各位大虾,本人对下面的代码总是改不对,不知道怎么让它正常运行起来,特别是那个函数:List_list它的问题出在哪,或者是没有问题

List_list是创建并返回一个链表,它的参数为N个非空指针加一个空指针,创建一个有N个节点的链表,这N个节点的first字段存有参数列表中的N个非空指针,但它们的rest字段为空


#define   T   Thelist_T
typedef   struct   T   *T;


struct   T
{
T   rest;
void   *first;
};


T  
List_list(   void   *x,   ...   )
{
va_list   ap;
T   list,   *p=&list;

va_start(   ap,   x   );
for(   ;   x;   x=va_arg(   ap,   void   *   )   )
{
p=malloc(   sizeof(*p)   );
if(   p==NULL   )
{
printf(   "Warming,   the   merroy   point   to   NULL!\n "   );
free(p);
return   NULL;
}
(*p)-> first=x;
p=&(*p)-> rest;
}
*p=NULL;
va_end(ap);
return   list;
}

//   List_list:   test   routine
void   main(void)
{

T   list;

list=List_list(   "BABA ",   "MAMA ",   "DIID ",   "WO ",   NULL   );
printf(   "%s\n ",   list-> first   );
}


------解决方案--------------------
你的这段就不对,
struct T
{
T rest;
void *first;
};
这是什么啊? 死循环,看见没,
------解决方案--------------------
(*p)-> first=x; ///???p-> first = x;

p=malloc( sizeof(*p) );
虽然p分配了空间,但是p-> first没有.
需要
p-> first = malloc(sizeof(x)+1);
memset(p-> first,0,sizeof(p-> first));
strcpy(p-> first,x);


还有p=&(*p)-> rest; 不知道LZ想干什么?


------解决方案--------------------
(*p)-> first => p-> first;

p=&(*p)-> rest; => &(p-> rest)


------解决方案--------------------
struct T
{
T rest;
void *first;
};
改为
stuct T
{
struct T rest;
void *first;
};