c语言中结构体可以作为引用传递吗?如果可以为什么以下程序老出错(来自严蔚敏的数据结构)!求解决方法

c语言中结构体可以作为引用传递吗?如果可以为什么以下程序老出错(来自严蔚敏的数据结构)!急求
如题 代码如下
希望那个高手帮忙解决其中错误

#include<stdio.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct Wsqlist 
{
  int* elem;
  int length;
  int listsize;  
}Sqlist ;

int Initlist_Sq(Sqlist& Li);
int ListInsert_Sq(Sqlist& L,int i,int e);
int ListDelete_Sq(Sqlist& L,int i,int &e);

int Initlist_Sq(Sqlist& Li)
{
  Li.elem=(int *) malloc(sizeof(int)*LIST_INIT_SIZE );
  printf("OK!\n");
  if(Li.elem==NULL) exit(1);
  Li.length = 0;
  Li.listsize = LIST_INIT_SIZE;
  printf("OK!\n");
  return 0;
}
int ListInsert_Sq(Sqlist& L,int i,int e)
{
  int *p,*q;
  if(i<1||i>L.length+1) exit(1);
  if(L.length>=L.listsize)
  {
  int *newbase;
  newbase = (int *)realloc(L.elem,sizeof(int)*(L.listsize+LISTINCREMENT));
  if(!newbase) exit(1);
  L.elem = newbase;
  L.listsize+=LISTINCREMENT; 
  }  
  if(L.length==0) 
  L.elem[0]= e;
  else
  {
  q = &(L.elem[i-1]);
  for(p=&(L.elem[L.length-1]);p>=q;--p)
  *(p+1) = *p;
   
  *q = e;
  } 
  ++L.length;
  return 0; 
}

int ListDelete_Sq(Sqlist& L,int i,int &e)
{
  int *p,*q;
  if(i<1||i>L.length+1) exit(1);  
  p = &(L.elem[i-1]);
  e = *p;
  q = L.elem+L.length-1;
  for(;p<q;++p) *p = *(p+1);
  --L.length;
  return e; 
}
int main()
{
  Sqlist list;
  int m=0,n=0;
  Initlist_Sq(list);
  ListInsert_Sq(list,1,12);
  m = ListDelete_Sq(list,1,&n);  
  printf("%d\n",list.length); 
  getch(); 
  return 0;  
}


------解决方案--------------------
不可以,因为C中根本没有引用。呵呵

如果在C++中,结构体是可以有引用的
------解决方案--------------------
C/C++ code

#include <stdio.h> 
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>
#define LIST_INIT_SIZE 100 
#define LISTINCREMENT 10 
typedef struct Wsqlist  
{ 
  int* elem; 
  int length; 
  int listsize;         
}Sqlist ; 

int Initlist_Sq(Sqlist& Li); 
int ListInsert_Sq(Sqlist& L,int i,int e); 
int ListDelete_Sq(Sqlist& L,int i,int &e); 

int Initlist_Sq(Sqlist& Li) 
{ 
  Li.elem=(int *) malloc(sizeof(int)*LIST_INIT_SIZE ); 
  printf("OK!\n"); 
  if(Li.elem==NULL) exit(1); 
  Li.length = 0; 
  Li.listsize = LIST_INIT_SIZE; 
  printf("OK!\n"); 
  return 0; 
} 
int ListInsert_Sq(Sqlist& L,int i,int e) 
{ 
  int *p,*q; 
  if(i <1 ||i >L.length+1) exit(1); 
  if(L.length >=L.listsize) 
  { 
    int *newbase; 
    newbase = (int *)realloc(L.elem,sizeof(int)*(L.listsize+LISTINCREMENT)); 
    if(!newbase) exit(1); 
    L.elem = newbase; 
    L.listsize+=LISTINCREMENT;  
  }     
  if(L.length==0)  
  L.elem[0]= e; 
  else 
  { 
  q = &(L.elem[i-1]); 
  for(p=&(L.elem[L.length-1]);p >=q;--p) 
    *(p+1) = *p; 
    
  *q = e; 
  }  
  ++L.length; 
  return 0;  
} 

int ListDelete_Sq(Sqlist& L,int i,int &e) 
{ 
  int *p,*q; 
  if(i <1 ||i >L.length+1) exit(1);     
  p = &(L.elem[i-1]); 
  e = *p; 
  q = L.elem+L.length-1; 
  for(;p <q;++p) *p = *(p+1); 
  --L.length; 
  return e;  
} 
int main() 
{ 
  Sqlist list; 
  int m=0,n=0; 
  Initlist_Sq(list); 
  ListInsert_Sq(list,1,12); 
  m = ListDelete_Sq(list,1,n);   
  printf("%d\n",list.length);  
  getch();  
  return 0;     
}