| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1052 人关注过本帖
标题:我写的一个C程序,可能牵涉到指针的运用,编译通过,连接出错,高手帮忙~
取消只看楼主 加入收藏
novawl
Rank: 1
来 自:四川
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-11-26
收藏
 问题点数:0 回复次数:3 
我写的一个C程序,可能牵涉到指针的运用,编译通过,连接出错,高手帮忙~
程序代码:
#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;
int 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;
  return 1;
}
main()
{
  SqList *L=NULL;
  InintList_Sq(L);
  printf("%d,%d",L->listsize,L->length);
  return 0;
}



用turbo c 2.0 编译通过 连接时出现错误:
Linker Error:Undefined symbol '_InintList_Sq' in module B.c

以前在学习指针的时候也遇到过这样的

错误,老师在程序最前面定义了一个指针变量问题就解除了.可是老师没说为什么这样做.

这个问题困饶我好多天了,哪位高手帮帮我啊!



图片附件: 游客没有浏览图片的权限,请 登录注册


[[italic] 本帖最后由 novawl 于 2007-11-26 20:29 编辑 [/italic]]
搜索更多相关主题的帖子: 指针 编译 牵涉 
2007-11-26 20:22
novawl
Rank: 1
来 自:四川
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-11-26
收藏
得分:0 
原帖由 [bold][underline]死了都要C[/underline][/bold] 于 2007-11-26 20:45 发表 [url=http://bbs.][/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语句放到子程序中这么改.

还有答楼上的那位朋友,以前我老师定义的好象是一个无意义的指针变量.在后面好象用都没用到.
具体是怎样的,我记不清了.我们哪个老师脾气太怪了,问他是为什么又不给我们讲.
2007-11-26 21:08
novawl
Rank: 1
来 自:四川
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-11-26
收藏
得分:0 
其实我对malloc()  free() 的用法了解不多.
但我觉得如果子函数开辟的内存在子函数中一定会被释放的话,那我想实现用InintList_Sq()
初始化一个链表的话就不可行了?
但我写的程序的算法是从<数据结构>书上抄的.算法应该没问题的.
2007-11-26 21:18
novawl
Rank: 1
来 自:四川
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-11-26
收藏
得分:0 
程序的算法不复杂,只是描述静态链表的一些基本操作,比如初始化,删除,添加....
主要问题在C语言的描述上有问题.
我C语言基本是自学的,所以也不知道是哪儿的问题.
2007-11-26 21:25
快速回复:我写的一个C程序,可能牵涉到指针的运用,编译通过,连接出错,高手帮忙~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027878 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved