#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
typedef struct{
int *elem;
int length;
int listsize;
}SqList;
void InitList_Sq(SqList *L){
L=(SqList *)malloc(sizeof(SqList));
L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L->elem)
exit(-2);
L->length=0;
L->listsize=LIST_INIT_SIZE;
printf("%d,%d",L->listsize,L->length);
}
int main()
{
SqList *L=NULL;
InitList_Sq(L);
return 0;
}
----------------解决方案--------------------------------------------------------
原帖由 [bold][underline]死了都要C[/underline][/bold] 于 2007-11-26 20:45 发表 [url=http://bbs.bc-cn.net/redirect.php?goto=findpost&pid=1116145&ptid=188585][/url]
我大概知道问题出在那里了```
我把 printf("%d,%d",L->listsize,L->length);
剪贴到了 L->listsize=LIST_INIT_SIZE; 下面``
程序运行正确```
我大概知道问题出在那里了```
我把 printf("%d,%d",L->listsize,L->length);
剪贴到了 L->listsize=LIST_INIT_SIZE; 下面``
程序运行正确```
谢谢了.
但我的原意是想描述线性链表.
原程序如下.
List.h
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList *L){
L=(SqList *)malloc(sizeof(SqList));
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
Status DestroyList_Sq(SqList *L){
if(L==NULL) return ERROR;
free(L->elem);
free(L);
return OK;
}
Status ClearList_Sq(SqList *L){
Status St1,St2;
if(L==NULL) return ERROR;
St1=DestroyList_sq(L);
if(St1!=OK) return St1;
St2=InistList_Sq(L);
if(St2!=OK) return St2;
return OK;
}
Status ListEmpty_Sq(SqList L){
if(&L==NULL) return INFEASIBLE;
if(L.length==0) return TRUE;
else return FALSE;
}
int ListLenght_Sq(SqList L){
return L.length;
}
Status GetElem_Sq(SqList L,int i, ElemType *e){
if(&L==NULL||i<1||i>ListLength_Sq(L)) return ERROR;
*e=*(L.elem+i-1);
return OK;
}
int LocateElem_Sq(SqList L,ElemType e,Status(*compare)()){
int i=1;
ElemType *p=L.elem;
if(&L==NULL) return ERROR;
while(i<=L.length&&!(*compare)(*p++,e)) ++i;
if(i<=L.length) return i;
else return 0;
}
Status PriorElem_Sq(SqList L,ElemType cur_e,ElemType *pre_e){
int i=1;
if(&L==NULL) return ERROR;
while(i<=L.length&&cur_e!=*(L.elem+i-1)) ++i;
if(i==1) {pre_e=NULL;return OK;}
if(i==L.length&&cur_e!=*(L.elem+i-1)) {pre_e=NULL;return OK;}
else {*pre_e=*(L.elem+i-1-1);return OK;}
}
Status NextElem_Sq(SqList L,ElemType cur_e,ElemType *next_e){
int i=1;
if(&L==NULL) return ERROR;
while(i<=L.length&&cur_e!=*(L.elem+i-1)) ++i;
if(i==L.length) {next_e=NULL;return OK;}
else {*next_e=*(L.elem+i);return OK;}
}
Status ListInsert_Sq(SqList *L,int i,ElemType e){
ElemType *p,*q;
if(L==NULL||i<1||i>L->length+1) return ERROR;
if(L->length>=L->listsize){
ElemType *newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREAMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREAMENT;
}
q=L->elem+i-1;
for(p=L->elem+L->length-1;p>=q;--p) *(p+1)=*p;
*q=e;
++L->length;
return OK;
}
Status ListDelete_Sq(SqList *L,int i,ElemType *e){
ElemType *p,*q;
if(L==NULL||i<1||i>L->length) return ERROR;
p=L->elem+i-1;
*e=*p;
q=L->elem+L->length-1;
for(++p;p<=q;++p) *(p-1)=*p;
--L->length;
return OK;
}
Status ListTraverse_Sq(SqList L,Status (*visit)()){
int i;
if(&L==NULL) return ERROR;
for(i=1;i<=L.length;i++)
if((*visit)(*(L.elem+i-1))!=OK) return (*visit)(*(L.elem+i-1));
return OK;
}
虽然程序中有很多语法错误,但主要的问题是我提到的连接错误.
编写测试程序时,只要一用到List.h中的函数就出错.编写成一个C文件错误还是一样的.
我觉的可能是指针的运用上出了问题.但应该不是简单的把printf语句放到子程序中这么改.
还有答楼上的那位朋友,以前我老师定义的好象是一个无意义的指针变量.在后面好象用都没用到.
具体是怎样的,我记不清了.我们哪个老师脾气太怪了,问他是为什么又不给我们讲.
----------------解决方案--------------------------------------------------------
饿```````晕完了````这个更看不懂````
简单了知道了连表`````但是还不知道线性连表``````
这个`````很不好意思``我目前只能帮到这里了```
真想知道你老师是怎么添加那个指针变量的`````
----------------解决方案--------------------------------------------------------
其实我对malloc() free() 的用法了解不多.
但我觉得如果子函数开辟的内存在子函数中一定会被释放的话,那我想实现用InintList_Sq()
初始化一个链表的话就不可行了?
但我写的程序的算法是从<数据结构>书上抄的.算法应该没问题的.
----------------解决方案--------------------------------------------------------
那就是我弄错了`````
----------------解决方案--------------------------------------------------------
程序的算法不复杂,只是描述静态链表的一些基本操作,比如初始化,删除,添加....
主要问题在C语言的描述上有问题.
我C语言基本是自学的,所以也不知道是哪儿的问题.
----------------解决方案--------------------------------------------------------
居然被 L 迷惑了
[[italic] 本帖最后由 cosdos 于 2007-11-27 03:15 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
/* 主函数中的 L 指向 NULL */
/* 别被 L 这个名字给迷惑了,L 作为参数不能改 main() 中的 L */
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
typedef struct{
int *elem;
int length;
int listsize;
}SqList;
SqList * InitList_Sq(SqList * L)
{
L = (SqList *)malloc(sizeof(SqList));
L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(L == NULL || L->elem == NULL)
exit(-2);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return L;
}
int main(void)
{
SqList * L;
L = InitList_Sq(L); /* ^_^ */
printf("%d, %d", L->listsize, L->length);
getchar();
return 0;
}
[[italic] 本帖最后由 cosdos 于 2007-11-27 03:28 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
12楼的代码没看
1楼的那段问题所在,正如ls所言
函数参数传过去只是个副本,在被调用函数里malloc memory给副本,返回调用函数后是无效的
好像一般不推荐在被调用函数里分配空间吧,对调用者要求多
如果非要或是不得不这样做,用指针的指针
关于指针陷阱的,好像有本叫高质量c/c++编程的提过,林锐博士所写
另外,或许可以用定义一个全局指针变量,被调用函数不要参数
把c丢了3年了,近几天才又想拿起来看看
如果说得有误,莫怪
----------------解决方案--------------------------------------------------------
此外,链接错误那个不就是主函数中的调用的函数名写错了嘛
上面好几个朋友提到了
楼主是修改后错误依旧?
----------------解决方案--------------------------------------------------------