请教一个结构初始化的问题

skineffect 2009-09-23 05:16:55
就是我原来直接学的是Java,想补一补C的知识(貌似笔试的算法题都是用C写的)。写了个顺序表的程序,debug时发现是结构体初始化有问题。
我的疑问有几个:
1.结构体定义的是全局变量,不是应该自动初始化吗?就是其中的data数组全赋值为0,last为0。为什么在main函数中设置断点后看到data中的数据全是CXX0030:Error:expression cannot be evaluated呢?就连last中也是?我用的是VC6;
2.我这样初始化不行吗?为什么到main函数中将(*l).data数组全部赋值为0的语句就报错呢?
代码如下,谢谢啦~~
#include<stdio.h>
#include<string.h>
#define MAX 1000
#define null 0

typedef int datatype;
typedef struct selist {
int data[MAX];
int last;
} sequenlist;
sequenlist *l;

int insert_listseq(sequenlist *l, int x, int i) {
int j;
if((*l).last > MAX) {
printf("\n\t溢出错误!\n");
return (null);
} else if((i<1) || (i>(*l).last+1)) {
printf("\n\t该位置不存在!\n");
return (null);
} else {
for(j=(*l).last-1; j>=i-1; j--) {
(*l).data[j+1] = (*l).data[j];
}
(*l).data[i-1] = x;
(*l).last = (*l).last+1;
return 1;
}
}

int delete_address(sequenlist *l, int i) {
int j;
if((i<1) || (i>(*l).last+1)) {
printf("\n\t位置错误\n");
return (null);
} else {
for(j=i-1; j<(*l).last; j++) {
(*l).data[j] = (*l).data[j+1];
}
(*l).last --;
return(1);
}
}

int delete_data(sequenlist *l, int x) {
int i=0, j, len;
len = (*l).last;
while(((*l).data[i] != x) && (i<len)) {
i++;
}
if(x == (*l).data[i]) {
for(j=i; j<len; j++) {
(*l).data[i] = (*l).data[i+1];
}
(*l).last--;
return(1);
} else {
printf("该节点不存在!");
return (null);
}
}

int search_listseq(sequenlist *l, int key) {
int i=0;
datatype x = (*l).data[i];
while((x != key) &&(i < (*l).last)) {
i ++;
x = (*l).data[i];
}
if(x == key) return(i+1);
else return (null);
}

void print_listseq(sequenlist *l) {
int i, n=(*l).last;
for(i=0; i<n; i++) {
printf("\tdata[%2d]=%4d", i, (*l).data[i]);
if((i+1)%4 == 0) printf("\n");
}
}

void main() {
//memset((*l).data, 0, MAX);
//(*l).last = 0;
int i = 0, j=0;
for(j=0; j<MAX; j++) {
(*l).data[j] = 0;
}
(*l).last = 0;
for(i=0; i<10; i++) {
insert_listseq(l, i+1, i+1);
}
print_listseq(l);
}
...全文
125 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
sequenlist *l;


在使用一个指针之前,先用malloc给它分配空间。
rainwxj 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 rainwxj 的回复:]
1。sequenlist *l; 改为:sequenlist *l = NULL;

2。你根本没用给他分配空间,怎么能用memset来初始化呢,所以先应用molloc分配空间;
[/Quote]


应该是malloc
rainwxj 2009-09-23
  • 打赏
  • 举报
回复
1。sequenlist *l; 改为:sequenlist *l = NULL;

2。你根本没用给他分配空间,怎么能用memset来初始化呢,所以先应用molloc分配空间;
logiciel 2009-09-23
  • 打赏
  • 举报
回复
要改为

memset(&(*l).data, 0, MAX*sizeof(int));

或:

memset(l, 0, sizeof(sequenlist));

这样就使l指向的整个结构清0.
logiciel 2009-09-23
  • 打赏
  • 举报
回复
memset((*l).data, 0, MAX);

要改为

memset(&(*l).data, 0, MAX);

前面要加地址符号.
mstlq 2009-09-23
  • 打赏
  • 举报
回复
指针只是地址,要注意它指向什么地方,是否可用……

#include<stdio.h>
#include<string.h>
#define MAX 1000
#define null 0

typedef int datatype;
typedef struct selist {
int data[MAX];
int last;
} sequenlist;
sequenlist sl; //mark
sequenlist *l=&sl;//mark

int insert_listseq(sequenlist *l, int x, int i) {
int j;
if((*l).last > MAX) {
printf("\n\t溢出错误!\n");
return (null);
} else if((i<1) || (i>(*l).last+1)) {
printf("\n\t该位置不存在!\n");
return (null);
} else {
for(j=(*l).last-1; j>=i-1; j--) {
(*l).data[j+1] = (*l).data[j];
}
(*l).data[i-1] = x;
(*l).last = (*l).last+1;
return 1;
}
}

int delete_address(sequenlist *l, int i) {
int j;
if((i<1) || (i>(*l).last+1)) {
printf("\n\t位置错误\n");
return (null);
} else {
for(j=i-1; j<(*l).last; j++) {
(*l).data[j] = (*l).data[j+1];
}
(*l).last --;
return(1);
}
}

int delete_data(sequenlist *l, int x) {
int i=0, j, len;
len = (*l).last;
while(((*l).data[i] != x) && (i<len)) {
i++;
}
if(x == (*l).data[i]) {
for(j=i; j<len; j++) {
(*l).data[i] = (*l).data[i+1];
}
(*l).last--;
return(1);
} else {
printf("该节点不存在!");
return (null);
}
}

int search_listseq(sequenlist *l, int key) {
int i=0;
datatype x = (*l).data[i];
while((x != key) &&(i < (*l).last)) {
i ++;
x = (*l).data[i];
}
if(x == key) return(i+1);
else return (null);
}

void print_listseq(sequenlist *l) {
int i, n=(*l).last;
for(i=0; i<n; i++) {
printf("\tdata[%2d]=%4d", i, (*l).data[i]);
if((i+1)%4 == 0) printf("\n");
}
}

void main() {
//memset((*l).data, 0, MAX);
//(*l).last = 0;
int i = 0, j=0;
for(j=0; j<MAX; j++) {
(*l).data[j] = 0;
}
(*l).last = 0;
for(i=0; i<10; i++) {
insert_listseq(l, i+1, i+1);
}
print_listseq(l);
}

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧