当前位置: 代码迷 >> C语言 >> 我写的一个C程序,可能牵涉到指针的运用,编译通过,连接出错,高手帮忙~
  详细解决方案

我写的一个C程序,可能牵涉到指针的运用,编译通过,连接出错,高手帮忙~

热度:192   发布时间:2007-11-26 21:04:04.0
完整的程序应该是这样的:
#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;  下面``

程序运行正确```


谢谢了.
但我的原意是想描述线性链表.
原程序如下.

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年了,近几天才又想拿起来看看
如果说得有误,莫怪
----------------解决方案--------------------------------------------------------
此外,链接错误那个不就是主函数中的调用的函数名写错了嘛
上面好几个朋友提到了
楼主是修改后错误依旧?
----------------解决方案--------------------------------------------------------
  相关解决方案