| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 983 人关注过本帖
标题:关于链表的建立
只看楼主 加入收藏
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
楼主你在进行文件操作的时候全部是按照 txt 格式进行的操作,所以打开文件的时候没必要用 b。
虽然在这里对文件操作没有任何影响,但是代码读起来会比较别扭。
下面咱们来分析一下你的代码
程序代码:
struct connection *open(FILE *ps1,struct connection *head,struct connection *p)      // 这里的参数 head 和 p 都只在函数 open() 内部使用
{                                                                                    // 而且完全不必受到传递的参数值的影响
    struct connection *s;                                                            // 所以没必要定义为参数,定义两个局部变量就可以了。
    p=head;
    while(fgetc(ps1)!=EOF)    // 这里面的 fgetc() 在每次开始读取数据之前先从文件中读取一个字符,并将文件读取位置向后移 1 字节。
    {                         // 这将会导致你的文件的第一条记录读取不完整,也就是少了第一个字符。你也可以向文件开头写入一个无意义的字符来避免这种错误

         s=(struct connection*)malloc(sizeof(struct connection));                    // 以下 4 行会先为 p->next 分配空间,然后向 p 指向的结构体
         p->next=s;                                                                  // 读入数据,并将 p 指向 p->next。
         // 下面 fscanf 中, 在数组变量前不需要加 '&',加了也不会错
         fscanf(ps1,"%d%s%s%s%s",&p->number,&p->name,&p->adress,&p->tphone,&p->qq);  // 这么做在全部记录读取完之后,链表尾部会多出一个内容不确定的节点。
         p=s;                                                                        // 
    }
    p->next=NULL;
    return head;
}


如果楼主以前用 fwrite() 进行过文件操作,把之前生成的文件删掉,重新写一个文件。
因为 fwrite() 写的文件用 fscanf() 去读肯定要出问题~

[ 本帖最后由 voidx 于 2011-6-9 11:55 编辑 ]
2011-06-09 11:53
qldxsun
Rank: 4
等 级:业余侠客
帖 子:125
专家分:240
注 册:2011-6-4
收藏
得分:0 
回复 16楼 voidx
额,就是“链”着的……
2011-06-09 13:38
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 22楼 qldxsun
那应该是 linked ~
2011-06-09 14:46
小菜小C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:70
专家分:111
注 册:2011-3-18
收藏
得分:0 
回复 21楼 voidx
现在问题已经解决,虽然不是你这样写的,但还是要谢谢你这么热心,分都给你吧。

菜鸟一名,准备起飞
2011-06-10 17:26
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 24楼 小菜小C
先谢谢你,楼主也把遇到的是什么问题和怎么解决的发出来吧,让大家一起学习,少走弯路
2011-06-10 19:49
小菜小C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:70
专家分:111
注 册:2011-3-18
收藏
得分:0 
好吧,现在手机上,有空了把代码贴上

菜鸟一名,准备起飞
2011-06-11 08:44
小菜小C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:70
专家分:111
注 册:2011-3-18
收藏
得分:0 
我做了一个链表的通讯管理系统,这做的过程中,遇到的问题有以下几点:
1.链表的建立,刚开始不理解链表的建立为什么会通过
struct connection *s,*p,*h;
然后再建立链表,通过一些最基本的探索才明白。。char c;
    struct connection *s;
    while(p->next==NULL)                                          
    {
             s=(struct connection*)malloc(sizeof(struct connection));
             p->next=s;                        //把s的地址赋值给p-next
             printf("请输入编号:\n");
             scanf("%d",&s->number);
                printf("请输入名字:\n");
              fflush(stdin);
             gets(s->name);
             printf("请输入地址:\n");
             fflush(stdin);
             gets(s->adress);
             printf("请输入联系电话或者手机:\n");
             fflush(stdin);
             gets(s->tphone);
             printf("请输入QQ号:\n");
             fflush(stdin);
             gets(s->qq);
             p=s;
             printf("是否还要继续增加?y/n\n");
             fflush(stdin);
             scanf("%c",&c);
             if(c=='y'||c=='Y')
             {
                 p->next=NULL;
             }
             p=s;                           //把s的地址赋值给p
             if(c!='y'&&c!='Y')
             {
                 p->next=NULL;
                 break;
             }
    }
    return head;
2.在增加记录过程中,我刚开始忽略了怎样续加的过程,到后来有人提醒后才加上,我的续加所实现的方法是令每一次增加过后的最后一个节点的next指向空,这样就使得续加得以实现,如上代码。
3.关于文件,关于文件我是用fprintf和fscanf这样的方法存储和提取的,在这过程中总结出了有几点常识:
(1)当使用feof()语句时,文件指针会指向第一个字节的下一位,也就是说,当我fsanf时,是从第二个字节开始的,所以自爱读的时候会出现“屯”或者少读一个的情况,还有就是保存的时候通过链表保存时,由于头节点是空导致了文件保存后,再去读取时会出现“屯”这种现象。所以我的解决方法是如果我的head->next是空的话,就先不建立这个文件,最后完美解决。
void os(FILE *ps,FILE *ps1,struct connection *head,struct connection *p)                            //写进文件里
{
    rewind(ps);
    rewind(ps1);
    p=head->next;
    fprintf(ps,"\t****************************************************\n");
    fprintf(ps,"编号\t\t名字\t\t地址\t\t电话或联系方式\t\tQQ号\n");
    while(p!=NULL)
    {
        fprintf(ps1," %d %s %s %s %s ",p->number,p->name,p->adress,p->tphone,p->qq);               
        fprintf(ps,"%d %18s %18s %18s %18s\n",p->number,p->name,p->adress,p->tphone,p->qq);
        p=p->next;
     }
    fprintf(ps,"******************************************************\n");
    printf("保存成功!\n");
}
好了,该说的都已经说完了,如果哪位同学仍有对这些不理解的可以问我,我会尽自己最大的努力去解决他们。

[ 本帖最后由 小菜小C 于 2011-6-12 17:47 编辑 ]

菜鸟一名,准备起飞
2011-06-12 17:45
z843137202
Rank: 1
等 级:新手上路
帖 子:19
专家分:9
注 册:2011-6-12
收藏
得分:0 
受教了啊 。。
2011-06-13 00:49
z843137202
Rank: 1
等 级:新手上路
帖 子:19
专家分:9
注 册:2011-6-12
收藏
得分:0 
回复 4楼 laoyang103
我想请教一下这个怎么用啊?
2011-06-13 00:54
快速回复:关于链表的建立
数据加载中...
 
   



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

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