读书人

c语言中结构体可以作为引用传递吗?如

发布时间: 2012-04-09 13:41:25 作者: rapoo

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;     } 


[解决办法]
你把后缀改成c++再编译下看看。

读书人网 >C语言

热点推荐