| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2124 人关注过本帖
标题:[原创]一个简单的链表程序
只看楼主 加入收藏
风轩雨客
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-2-7
收藏
得分:0 
双链表用起来太累人啦!
2005-02-16 10:40
风轩雨客
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-2-7
收藏
得分:0 
用在这里是否是杀鸡用了牛刀了啊???
2005-02-16 10:41
adm_qxx
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2005-4-5
收藏
得分:0 
哇,有点长,
不是一时半会看的出来滴.

学习是进步的基础.
2005-04-05 16:09
NEW5945
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2005-11-3
收藏
得分:0 

while(!feof(fp))
{
load_point=(struct card*)malloc(sizeof(struct card));
fread(load_point,sizeof(struct card),1,fp);
load_point->next_point=now_point->next_point;
load_point->front_point=now_point;
now_point->next_point=load_point;
now_point=load_point;
}
fclose(fp);

你的这段代码只要加个if{}else 就可以
while(!feof(fp))
{
load_point=(struct card*)malloc(sizeof(struct card));
if(fread(load_point,sizeof(struct card),1,fp))
{
load_point->next_point=now_point->next_point;
load_point->front_point=now_point;
now_point->next_point=load_point;
now_point=load_point;
}
else
{
free(load_point);
}
}
fclose(fp);


还有一个小的问题需要解决,虽然不会造成致命错误,但是培养好的习惯总是好的:)

在save()的函数内,结束部分最好加上 fclose(fp);


关于你的程序出现的问题,我的个人理解:
1.错误发生在load阶段,因为整个链表是通过从文件中读取然后再在内存中构造的,并且文件中不需要存储head,end节点
2.存储过程就不说明了。
3.在读取过程中的终止条件是 feof(fp),这个也没有错。关键问题在于fread()和feof()的结合上面,由于文件的实际大小会比所存储的数据稍大,而且当读到最后一个数据后似乎还有一段存储空间(可能是预留的)。所以导致 出现这种情况:

当所存储数据已经全部读出来,而判定条件仍然成立。从而导致每次load都会在文件末尾添加一个空数据
为了避免该情况发生,我们可以利用fread()本身特性,通过判定其返回值来进行进一步的判定,当读取到空数据部分时 其返回值为0。
PS:free(load_point)只是为了减少碎片,不加上else一段也是不会出错的,但是好习惯希望人人都能养成:)

共同进步,很喜欢这种解决无法解释的问题的瞬间快感。。。。哈哈

[此贴子已经被作者于2006-8-8 11:21:11编辑过]


Q号:124606779 Q群:6797073 爱闲逛的人.......
2006-08-08 11:20
jyycom
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2006-5-18
收藏
得分:0 

仔细读了一遍,受教了!
难道编程高手都是半夜工作?^_^


重新学习C语言!
2006-08-08 13:31
NEW5945
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2005-11-3
收藏
得分:0 
在此想请教

神和knocker一个问题。目前还不知道该问题是怎么一回事。。。。

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
char *a[5]; //最初申明的数组指针
int n;
cout<<"请输入字符串数目:";
cin>>n;
cout<<"请输入"<<n<<"个字符串:"<<endl;
for(int i=0;i<n;i++)
{
a[i]=new char[10]; //分配10个字符的输入空间,这里可以视情况自己改 ;
cin>>a[i];

}
for(i=0;i<n;i++)
{
cout<<a[i]<<endl; //观察输入数据的输出情况;
}
for(i=n-1;i>-1;i--)
{
delete []a[i]; //释放内存空间;
}
return 0;
}

这样的程序会出现个问题是 比如此程序目前声明的数组指针是5 (PS:2以上都可以) 的,你如果输入6个及6个以下的字符串( PS:即 当输入字符串小于等于 n+1) 是不会报错的,但是你声明的数组指针是1的话(PS: char *a[1]; 那么你输入的N=2的话并且输入字符串,就会报错。 这个与前面的 能输入N+1个字符串的结论就有矛盾了 )

我想此问题应该是属于空间声明的再分配问题,但是为什么n+1的情况在为1的时候就不成立?
想不明白。。。。。
以下是一个更奇怪的问题,以上的问题我只要加一个string 的声明,上面的问题就都没有了,而且就我所能输入的最大范围,都不会报错

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
char *a[5]; //最初申明的数组指针

string s; //注意这里,只是声明(分配了空间)。但是不明白为什么S的空间怎么可以对char *a[5]照成影响。。。。。。

int n;
cout<<"请输入字符串数目:";
cin>>n;
cout<<"请输入"<<n<<"个字符串:"<<endl;
for(int i=0;i<n;i++)
{
a[i]=new char[10]; //分配10个字符的输入空间,这里可以视情况自己改 ;
cin>>a[i];

}
for(i=0;i<n;i++)
{
cout<<a[i]<<endl; //观察输入数据的输出情况;
}
for(i=n-1;i>-1;i--)
{
delete []a[i]; //释放内存空间;
}
return 0;
}

机器

CPU:AMD 3000+
操作系统:MS windows2000 pro
编译环境:VC6.0英文版

Q号:124606779 Q群:6797073 爱闲逛的人.......
2006-08-08 20:29
NEW5945
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2005-11-3
收藏
得分:0 
不是需要大家对其进行修改。。。我是想知道为什么加上一个string就能解决所遇到的溢出的问题。。。

Q号:124606779 Q群:6797073 爱闲逛的人.......
2006-08-08 20:31
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
这种问题不必讨论,不同编译器会有不结果.

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-08 20:34
NEW5945
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2005-11-3
收藏
得分:0 
多谢

Q号:124606779 Q群:6797073 爱闲逛的人.......
2006-08-09 08:22
快速回复:[原创]一个简单的链表程序
数据加载中...
 
   



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

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