| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 925 人关注过本帖
标题:严的书就是看不懂
只看楼主 加入收藏
coolda
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-3-15
收藏
 问题点数:0 回复次数:4 
严的书就是看不懂
严的书就是看不懂,不知道是本人基础差,比较笨的原因,还是真的是复杂化了

下面抄两段代码,一段是严的,另一段是自考书<<数据结构导论的>>

带着一些疑问,希望有人解答一下。


来自数据结构导论 :

1。定义顺序表

const maxsize=100;
typedef struct
{
int data[maxsize];
int last; //数据域当前的长度
}sqlist;

sqlist L;

2.插入运算

void insert_sqlist(sqllist L int x,int i)
{
if (L.last==maxsize)error('表满'); /*溢出*/
if ((i<1)||(i>L.last+1))error('非法位置');
for(j=L.last;j=i;j--)
 L.data[j]=L.data[j-1];
L.data[i-1]=x;
L.last=L.last+1;

}

(1)last都没被赋怎么表示顺序表的末点?
 (2)i>L.last+1 为什么要L.last+1才表示溢出? >L.last不就可以表示溢出?
 (3)为什么要在第i个位置上插入x,却是L.date[i-1]位置插入,是因为数组从0开始,所以i-1?
 

摘自严的书:

//线性表的动态分配顺序存储结构
#define list_init_size 100 //线性表存储空间的初始分配量
#define listincrement 10 //线性表存储空间的分配增量
typedef struct
{
elemtype *elem;  //存储空间基址
int length; //当前长度
int listsize; //当前分配的容量
}sqlist;

status initlist_sq(sqlist &L)
{
//构造一个空的线性表
L.elem=(elemtype*)malloc(list_init_size*sizeof(elemtype));
if(!L.elem)exit(overflow);//存储分配失败
L.length=0;   //空表长度为0
L.listsize=list_init_size //初始化容量
return OK;
}
//initlist_sq

插入运算

status listinsert_sq(sqlist &L ,int i,Elemtype e)
{
if (i<1||i>L.length+1)return error;
if (L.length>=L.listsize
{ //当前空间已满,增加分配
newbase=(elemtype*)realloc(L.elem,(L.listsize+listincrement)*size(elemtype));
if(!newbase)exit(overflow);
L.elem=newbase;
L.listsize+=listincrement;
}
iq=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}

问题:
(1)L.elem=(elemtype*)malloc(list_init_size*sizeof(elemtype));此句什么意思?
搜索更多相关主题的帖子: 数据 
2009-10-24 20:50
chengUFO
Rank: 1
等 级:新手上路
帖 子:65
专家分:5
注 册:2009-8-8
收藏
得分:0 
L.elem=(elemtype*)malloc(list_init_size*sizeof(elemtype));这是动态分配内存空间。。
2009-10-25 00:21
xiaohui240
Rank: 1
来 自:武汉
等 级:新手上路
威 望:1
帖 子:9
专家分:8
注 册:2009-9-24
收藏
得分:0 
(1)last都没被赋怎么表示顺序表的末点?
(2)i>L.last+1 为什么要L.last+1才表示溢出? >L.last不就可以表示溢出?
(3)为什么要在第i个位置上插入x,却是L.date[i-1]位置插入,是因为数组从0开始,所以i-1?
答:
(1)因为这里只是讲算法,插入算法要求你传进来参数,当然你传进来的参数肯定是要赋值好的了。比如说你在main里面来测试这个算法,你肯定要先定义一个顺序表结构,在main里面你肯定要初始化。
(2)这个i是指插入的位置,插入的位置肯定可以是L.last也就是最后一个位置。如果比这个位置大说明错误嘛。比如说你这个表长100,你在100位置上插入肯定是可行的,但是要是输入个101,你需要插入在101上肯定是不行的。
(3)你的回答是正确的,因为这个是C描叙的,c里面数组下标是从0开始的。位置减一才代表下标。

L.elem=(elemtype*)malloc(list_init_size*sizeof(elemtype));是动态分配内存,这个属于C语言的语法问题。不输入数据结构讨论的范围。你可以去查阅相关资料看看malloc这个函数怎么用。
 我这里简单说下,malloc 分配你传递参数个字节的内存,比如你传个100进去,就给你分配100字节的内存,这里你传来list_init_size*sizeof(elemtype),就分配这么多字节的内存。其中list_init_size指的多少个elem,然后用sizeof求elem的每个元素占用的字节数。两个相乘,这样就能分配你所需要的字节了。但是malloc返回的是void 类型的这块内存的首地址。但是你接受这个地址是用的elem类型的,所以需要做个强制转换,在前面有个(elemtype*)是做强制转换用的。
  需要注意到是用malloc分配的内存不能够被自动释放,需要你自己去调用release函数来释放,不然的话可能会造成内存泄漏。


希望对你有所帮组。

[ 本帖最后由 xiaohui240 于 2009-10-26 16:51 编辑 ]
2009-10-26 16:49
xiaohui240
Rank: 1
来 自:武汉
等 级:新手上路
威 望:1
帖 子:9
专家分:8
注 册:2009-9-24
收藏
得分:0 
如果还有什么问题可以msn交流下:加xiaohui-msn@
2009-10-26 16:52
天空种子
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-11-16
收藏
得分:0 
这里应该是for(j=L.last;j>=i;j--)
2009-11-16 19:25
快速回复:严的书就是看不懂
数据加载中...
 
   



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

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