.L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType *))会出现什么问题
时间: 2023-11-19 20:06:34 浏览: 242
这段代码可能会出现以下问题:
1. 在分配内存时,可能会分配失败,导致返回空指针;
2. 在这个代码中,使用的是sizeof(ElemType *),如果ElemType本身就是指针类型,那么实际上分配的内存大小可能会出现问题;
3. 使用malloc分配的内存必须手动释放,否则可能会出现内存泄漏的问题。
相关问题
修改代码:status InitSqlist(Sqlist &L){ L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype)); if(! L.elem) return error; L.length = 0; L.listsize = LIST_INIT_SIZE; return ok; } void PrintSqlist(Sqlist &L){ for(int i=0;i<L.length;i++) printf(" %2d ",L.elem[i]); printf("\n"); } void Get(Sqlist &L,int n) { int i; for(i=1 ; i<n ;i++) { scanf("%d",&(L.elem[i].key)); L.length++; } } int Search(Sqlist L, keyType key) { L.elem[0].key = key; int i; int count; for(i = L.length; !EQ(L.elem[i].key,key); i--) { count++; } return count; } int main() { int n,i; int key,count; Sqlist L; InitSqlist(L); printf("请输入顺序表的长度(顺序查找)\n"); scanf("%d",&n); printf("请输入一批数据\n"); Get(L,i); printf("以下为输入的顺序表(顺序查找)\n"); PrintSqlist(L); printf("请输入你想查找的元素(顺序查找)\n"); scanf("%d",&key); count = Search(L,key); if(count == 0) { printf("查找失败%d",&key); } else { printf("关键字 %d 的位置是 %d,查找次数是 %d\n", key, n - count + 1, count); } return 0; }
修改后的代码如下:
```
status InitSqlist(Sqlist &L){
L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
if(! L.elem)
return ERROR;
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
void PrintSqlist(Sqlist L){
for(int i=0;i<L.length;i++)
printf(" %2d ",L.elem[i].key);
printf("\n");
}
void Get(Sqlist &L,int n) {
for(int i=1; i<=n; i++)
{
scanf("%d",&(L.elem[i].key));
L.length++;
}
}
int Search(Sqlist L, keyType key) {
int i = L.length-1;
int count = 0;
while(i>=0 && L.elem[i].key!=key){
i--;
count++;
}
if(i<0){
return 0;
}else{
count++;
return count;
}
}
int main() {
int n,key,count;
Sqlist L;
InitSqlist(L);
printf("请输入顺序表的长度(顺序查找)\n");
scanf("%d",&n);
printf("请输入一批数据\n");
Get(L,n);
printf("以下为输入的顺序表(顺序查找)\n");
PrintSqlist(L);
printf("请输入你想查找的元素(顺序查找)\n");
scanf("%d",&key);
count = Search(L,key);
if(count == 0)
{
printf("查找失败%d",key);
}
else
{
printf("关键字 %d 的位置是 %d,查找次数是 %d\n", key, L.length-count+1, count);
}
return 0;
}
```
修改说明:
1. Get 函数中的循环条件应该是 `i<=n` 而不是 `i<n`,这样才能正确读入 n 个元素。
2. Search 函数中的循环条件应该是 `i>=0` 而不是 `!EQ(L.elem[i].key,key)`,这样才能正确查找到元素。
3. 在找到元素时,应该返回查找次数 count,而不是 n-count+1。因为 n 是输入的长度,可能大于实际存储的元素个数,而实际存储的元素个数是 L.length。
typedef struct { ElemType* elem; int length; }Sqlist; //构造空的顺序表 Status InitList(Sqlist* L) { L->elem=
这是一个C语言中定义顺序表的结构体和初始化该顺序表的函数。首先,我们来看这个结构体定义:
```c
typedef struct {
ElemType* elem;
int length;
} Sqlist;
```
在这个结构体`Sqlist`中,有两个成员:
1. `ElemType* elem`:这是一个指向`ElemType`类型的指针,`ElemType`通常是一个用`typedef`定义的类型。在这个上下文中,它可能代表了顺序表中存储的数据类型。通常情况下,顺序表存储的是同一种数据类型的元素。
2. `int length`:这是一个整型变量,用来表示顺序表当前的长度,即顺序表中元素的数量。
接下来,我们看`InitList`函数的定义:
```c
Status InitList(Sqlist* L) {
L->elem = // 这里似乎代码没有完整给出,理论上应该分配内存给顺序表,并初始化length为0。
// 例如:
// L->elem = (ElemType*)malloc(sizeof(ElemType) * LIST_INIT_SIZE);
// if (!L->elem) return ERROR; // 如果内存分配失败,返回错误状态
// L->length = 0; // 初始化长度为0
// 由于代码不完整,这里不提供具体的实现。
}
```
通常情况下,`InitList`函数会分配一个初始大小的内存给`elem`指针,并将`length`初始化为0,表示这是一个空的顺序表。这样顺序表就初始化完成了,之后可以进行添加元素等操作。
阅读全文