蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 | -->
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程 -->


    

蓝森林 http://www.lslnet.com 2006年8月16日 14:08

到底什么是静态链表?

我有一个疑惑的地方:谭爷爷举例中,把程序中固定的,不能随意生成,也不能释放的叫“静态链表”。而严蔚敏又用数组来定义“静态链表”。我现在不知道了。到底什么叫“静态链表”

Re: 到底什么是静态链表?

没错阿,数组就是静态的。一旦定义过,它的大小便不能动态增加或减少

Re: 到底什么是静态链表?

但现在是。谭爷爷认为,用指针的链表只要是在程序中生成固定不便的,也是“静态链表”。而且他没有提到数组。况且数组也不一定是“静态链表”,一般的数组只能是线性表。而只有具备相当于malloc和free功能的数组才是“静态链表”

Re: 到底什么是静态链表?

线性非线性是相对于是否存在于连续的内存空间而言。我可以用数组存储不在连续内存空间的数据。(即存贮指针地址)
这个链表是通过数组连接起来的可是链表的大小受数组大小的限制。这就是静态链表。

Re: 到底什么是静态链表?

请看这个:
#define NULL 0
struct student
{long num;
float score;
struct student *next;
};
main()
{struct student a,b,c,*head,*p;
a.num=111;a.score=88;
b.num=222;b.score=99;
c.num=333;c.score=77;
head=&a;
a.next=&b;
b.next=&c;
c.next=NULL;
p=head;
do{
printf"%ld %5.1f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
}
这个是谭爷爷书上的原文;“本例比较简单,所有的接点都是在程序中定义,不是临时开辟的,也不能用完后释放,这种链表称为‘静态链表’”;
你们说这个话对吗?


Re: 到底什么是静态链表?

谭老师的解释更抽象同时也更严格一些。静态链表,动态链表是指一种数据(元素)存在形式。数组的数据(元素)和静态链表的数据(元素)存在形式相同,即在一相对时间内元素空间是不能变化的,不管你用不用到它,它都存在了。如果严所说的数组是指静态动态数组之总称,那么我想他们两者所述的是一致的。

Re: 到底什么是静态链表?

严没有这样说:
在线性表中他是用抽象的连续地址的形式来说名
而在说“静态链表”的时候者用了数组,不过已经不是一般的数组
通过定义ADT把数组变成可以不连续存储数据!可以进行类似malloc和free。当然总量是固定的。就象你的内存也是固定的一样!我感觉他说得比谭爷爷有道理。不知道大家看过那本书没有。我原来教材是英文版,但暑假还是那严的书来看了看。所以就产生了这个想法。
请指教

Re: 到底什么是静态链表?

严的那本书我没看过,我学c语言也是从谭的书开始的,但是当时我也没浓明白静态链表和动态链表到底有什么区别,但是后来看了数据结构,再加上工作中的体会,我觉的无非就是元素是否预先分配。
你说的“可以进行类似malloc和free”的数组就是动态数组。我想严的数组就是静态动态数组的总称。

Re: 到底什么是静态链表?

看程序,所谓的“静态链表”,根本就是一种编程方法,给人一种取巧的感觉。
个人感觉,这种方法不实用。链表的一个好处是可以动态的加减元素。这样一做,就没有了这个好处了。
在实际编程中,我还真的没有看到这样的用法。
忽略了元素的创建和删除,在教学上倒是一个挺有用的例子。


Re: 到底什么是静态链表?

我觉得链表也是一种数据结构(组成)形式,FAT结构就是静态链表的形式,还比较有用吧:-),至少很“简单”。

Re: 到底什么是静态链表?

恩,我现在想想,感觉他们都有道理,
不过还是严道理多一点:
“为了和指针型描述的线性链表相区别,我们给这种用数组描述的链表起名叫‘静态链表’”;
谭爷爷书上的原文:
“本例比较简单,所有的接点都是在程序中定义,不是临时开辟的,也不能用完后释放,这种链表称为‘静态链表’”;
我主要是学习阶段,没什么实践,所以想分辨清楚点,不好意思;


Re: 到底什么是静态链表?

能不能举个“用数组描述的链表”的例子?我总觉得严说的有问题。谭说的肯定没错。

Re: 到底什么是静态链表?

"
///////////////////////////////////////////////////////
//实现由终端输入集合A,B实现集合运算(A-B)U(B-A)
//类c语言描述
///////////////////////////////////////////////////////

#define MAXSIZE 1000

typedef struct {
int data;
int cur;
}component,SLinkList[MAXSIZE];

//将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,‘0’表是空指针
void InitSpace_SL(SLinkList &space) {
int t;
for(t=0;t<MAXSIZE-1;++t)
space[m].cur=t+1;
space[MAXSIZE-1].cur=0;
}

//若备用空间链表非空,返回分配的接点下标,否则返回0
int Malloc_SL(SLinkList &space){
int t;
t=space[0].cur;
if(space[0].cur)
space[0].cur=space[t].cur;
return t;
}

//将下表为k的空闲接点回收到备用链表
void Free_SL(SLinkList &space,int k) {
space[k].cur=space[0].cur;
space[0].cur=k;
}

//依次输入集合a和b的元素,在space中建立表示集合(a-b)U(b-a)的静态
//链表,s为其头指针。假设备用空间足够大,space[0].cur为其头指针。
void difference(SLinkList &space,int &S){
int m,n,f,k,t,j,b,r,p;
InitSpace_SL(space);
S=Malloc_SL(space);
r=S;
printf("Enter the number item of A and B\n");
scanf("%d %d",&m,&n);
for(j=1;j<m;++j){
m=Malloc_SL(space);
printf("Enter the item of A:\n");
scanf("%d",&space[m].data);
space[r].cur=t;
r=t;
}
space[r].cur=0;
for(j=1;j<=n;++j){
printf("Enter the item of B\n");
scanf("%d",&b);
while(k!=space[r].cur&&space[k].data!=b) {
p=k;
k=space[k].cur;
}
if(k==space[r].cur) {
t=Malloc_SL(space);
space[t].data=b;
space[t].cur=space[r].cur;
space[r].cur=t;
}
else {
space[p].cur=space[k].cur;
Free_SL(space,k);
if(r==k)
r=p;
} //else
} //for
} //difference

说明:举个例子A=(c,b,e,g,f,d),B=(a,b,n,f)
运算前:
space(0:11)
0 8
1 2
2 c 3
3 b 4
4 e 5
5 g 6
6 f 7
7 d 0
8 9
9 10
10 11
11 0

运算后:
space(0:11)
0 6
1 2
2 c 4
3 n 8
4 e 5
5 g 7
6 f 9
7 d 3
8 a 0
9 10
10 11
11 0
"



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com