精华内容
下载资源
问答
  • 为了观察网络用户浏览行为以研究用户偏爱浏览模式集和个人兴趣,本文采用频繁链表结合存取增量式结构,使用捕获网络用户浏览轨迹构建、更新该结构并使用同类合并思想挖掘该结构以获得用户偏爱浏览模式集。...
  • 这是一个读取文件中的链表,然后再存进新的链表为本次操作所使用,但是在存到新链表中 ,画红线p2->next=p1;时候就会报错。这是一个双向链表,![图片说明]...
  • 效率,内存移动 顺序存储…
    1. 效率,内存移动
    2. 顺序存储…
    展开全文
  • 一个由VC 6.0 编写学生管理系统源代码,基于TXT链表技术,编程目的:编写一个学生管理系统,每个学生应该包含如下信息:地址,出生日期,学科成绩(语文,英语,数学,物理),个人信息(姓名,性别,民族,国籍,...
  • C语言实现链表与文件的存取

    千次阅读 多人点赞 2020-10-04 11:04:07
    作者:柠檬i,学习C时长两个月半个人练习生

    作者:柠檬i,学习C时长两个月半的个人练习生

    第一次写文章,难免有些不足,请多多包涵。

    本程序主要功能是建立链表,然后把链表数据存储到文件中,然后把文件数据存储到数组中并输出。

    不多说了,放代码。

    此处为main函数的内容

    int main(void)
    {
        char filename[50];
        printf("How many ?: ");
        scanf("%d", &n);		/*输入学生数*/
        printf("please input filename: ");
        scanf("%s", filename);	/*输入文件所在路径及名称*/
        Create();       //调用函数建立链表
        save(filename); //调用函数存到文件
        free(phead);//释放phead内存
        show(filename); //调用函数输出文件
        system("pause");
        return 0;
    }
    

    一、输入数据到链表中

    建立链表并输入数据到链表里
    代码如下:

    typedef struct stu
    {
        char name[20];
        char adr[20];
        int tel;
        struct stu* pnext;
    } stu;
    int n;	//n存着信息条数
    stu* phead=NULL;//phead为链表首地址
    
    void Create()          //建立链表
    {
        stu *pend,*pnew;//尾节点,新节点
        pend=phead =(stu*)malloc(sizeof(stu));//分配内存给首节点
        printf("please first input Name, Adress and telephone:\n");
        for(int i=0;i<n;i++)
        {
            pnew=(stu*)malloc(sizeof(stu));  //分配新节点
            pend->pnext=pnew;   //原来的尾节点指向新节点
            pnew->pnext=NULL;  	//新节点的指针为NULL
            printf("NO.%d: ",i+1);
            scanf("%s", pend->name);
            scanf("%s", pend->adr);
            scanf("%d",&pend->tel);
            pend=pnew;  //赋值后指向尾节点
        }
        pnew=pnew->pnext;//指向NULL
        free(pnew);      //释放pnew内存
    }
    

    二、把链表数据存入文件

    此处用到了fopen、fprintf、fclose等文件操作函数

    代码如下:

    void save(char *filename)
    {
        FILE *w;//文件指针
        if ((w = fopen(filename, "wb")) == NULL){   /*二进制只写打开文件*/
            printf("cannot open file\n");
            exit(1);
        }
        for (int i = 0; i < n; i++)  //链表数据循环输入到文件内
        {
             fprintf(w,"%s ",phead->name);
             fprintf(w,"%s ",phead->adr);
             fprintf(w,"%d", phead->tel);
             fprintf(w,"%s","\r\n");//换行
             phead=phead->pnext;//指向下一个节点
        }
        fclose(w);	//关闭文件
    }
    

    三、输出文件

    先把文件内容保存到结构体数组内,然后再通过数组输出到屏幕上。
    代码如下:

    void show(char *filename)		//输出文件
    {
        FILE *fp;//文件指针
        stu info[100];  //负责存放文件中的数据,然后输出
        if ((fp = fopen(filename, "rb")) == NULL){   /*二进制只读打开文件*/
            printf("cannot open file\n");
            exit(1);
        }
        for (int i = 0; i < n; i++)
        {
            fscanf(fp,"%s",&(info[i].name));//输出数据到数组
            fscanf(fp,"%s",&(info[i].adr));
            fscanf(fp,"%d",&(info[i].tel));
            printf("%10s%15s%15d\n", info[i].name,
            	info[i].adr, info[i].tel); //输出数据到屏幕
        }
        fclose(fp); //关闭文件
    }        
    

    以下为完整代码:

    在这里插入图片描述

    /*此代码为《C语言从入门到精通(第二版)》第十四章(文件)的【例14.7】的改进版*/
    #include<stdio.h>
    #include<stdlib.h>
    #include<process.h>
    typedef struct stu
    {
        char name[20];
        char adr[20];
        int tel;
        struct stu* pnext;
    } stu;
    int n;	//n存着信息条数
    stu* phead=NULL;//phead为链表首地址
    
    void Create()/*建立链表*/
    {
        stu *pend,*pnew;//尾节点,新节点
        pend=phead =(stu*)malloc(sizeof(stu));//分配内存给首节点
        printf("please first input Name, Adress and telephone:\n");
        for (int i = 0; i < n; i++)
        {
            pnew=(stu*)malloc(sizeof(stu));  //分配新节点
            pend->pnext=pnew;   //原来的尾节点指向新节点
            pnew->pnext=NULL;   //新节点的指针为NULL
            printf("NO.%d: ",i+1);
            scanf("%s", pend->name);//输入数据存到链表中
            scanf("%s", pend->adr);
            scanf("%d",&pend->tel);
            pend=pnew;  //赋值后指向尾节点
        }
        pnew=pnew->pnext;//指向NULL
        free(pnew);      //释放pnew内存
    }
    void save(char *filename)/*存到文件内*/
    {
        FILE *w;//文件指针
        if ((w = fopen(filename, "wb")) == NULL){   /*二进制只写打开文件*/
            printf("cannot open file\n");
            exit(1);
        }
        for (int i = 0; i < n; i++)  //链表数据循环输入到文件里
        {
             fprintf(w,"%s ",phead->name);//数据存入到文件
             fprintf(w,"%s ",phead->adr);
             fprintf(w,"%d", phead->tel);
             fprintf(w,"%s","\r\n");//换行
             phead=phead->pnext;//指向下一个节点
        }
        fclose(w);	//关闭文件
    }
    void show(char *filename)/*输出文件*/
    {
        FILE *fp;//文件指针
        stu info[100];  //负责存放文件中的数据,然后输出
        if ((fp = fopen(filename, "rb")) == NULL){   /*二进制只读打开文件*/
            printf("cannot open file\n");
            exit(1);
        }
        for (int i = 0; i < n; i++)
        {
            fscanf(fp,"%s",&(info[i].name));//输出数据到数组
            fscanf(fp,"%s",&(info[i].adr));
            fscanf(fp,"%d",&(info[i].tel));
            printf("%10s%15s%15d\n", info[i].name, 
            	info[i].adr, info[i].tel);//输出数据到屏幕
        }
        fclose(fp);/*关闭文件*/
    }
    
    int main(void)
    {
        char filename[50];
        printf("How many ?:\n");
        scanf("%d", &n);		/*输入学生数*/
        printf("please input filename: ");
        scanf("%s", filename); /*输入文件所在路径及名称*/
        Create();       //调用函数建立链表
        save(filename); //调用函数存到文件
        free(phead);//释放phead内存
        show(filename); //调用函数输出文件
        system("pause");
        return 0;
    }
    
    

    我尝试过fread和fwrite的做法,但都失败了。

    参考文章:
    c语言链表数据存入文件和读取文件

    展开全文
  • 基于VC程序,演示利用链表实现文件随机存取
  • 原因是和list双端链表的数据结构有关系,由于不是连续存储,所以这里索引去查找元素就行不通。 在list容器中两个api,我们可能需要经常使用,获取头部和尾部的元素,front()和back() #include <iost.

    继续学习list容器相关常见的API,这边学习三点,分别是list容器的存取操作,和list容器反转,这个反转经常在面试的时候被问到,最后来看看list容器的排序操作。

     

    1.list的存取

    注意:list容器没有和其他容器那样,根据[]和at函数获取某个位置的元素。原因是和list双端链表的数据结构有关系,由于不是连续存储,所以这里索引去查找元素就行不通。

    在list容器中两个api,我们可能需要经常使用,获取头部和尾部的元素,front()和back()

    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    
    
    void printList(const list<int>& l)
    {
        for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    
    }
    
    void test01()
    {
        // list 大小
        list<int> li;   // 默认构造函数
    
        // 尾部加数据
        li.push_back(10);
        li.push_back(20);
        li.push_back(30);
        li.push_back(30);
        li.push_back(40);
        printList(li);
    
        // 获取头部元素
        cout << "Head of list: " << li.front() << endl;
    
        // 获取尾部元素
        cout << "end of list: " << li.back() << endl;
    
    }
    
    
    int main()
    {
        test01();
        system("pause");
        return 0;
    }

    运行结果

     

    2.list的反转

    反转函数reverse(),这个函数在多门开发语言都是存在的,至少java是有这个API。通过这个API, 可以把链表反转过来。

    下面来代码测试一下。

    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    
    
    void printList(const list<int>& l)
    {
        for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    
    }
    
    void test01()
    {
        // list 大小
        list<int> li;   // 默认构造函数
    
        // 尾部加数据
        li.push_back(10);
        li.push_back(20);
        li.push_back(30);
        li.push_back(30);
        li.push_back(40);
        printList(li);
    
        // 反转操作
        li.reverse();
        cout << "after reverse :" << endl;
        printList(li);
    
    }
    
    
    int main()
    {
        test01();
        system("pause");
        return 0;
    }

    测试结果

     

    3.list的排序

    这个sort()排序也是前面学习过的,默认升序。

    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    
    
    void printList(const list<int>& l)
    {
        for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    
    }
    
    void test01()
    {
        // list 大小
        list<int> li;   // 默认构造函数
    
        // 尾部加数据
        li.push_back(50);
        li.push_back(20);
        li.push_back(10);
        li.push_back(30);
        li.push_back(40);
        printList(li);
    
        // 排序操作
        li.sort();
        cout << "after sort :" << endl;
        printList(li);
    
    }
    
    
    int main()
    {
        test01();
        system("pause");
        return 0;
    }

    注意,由于list不支持随机访问,所以不支持前面学习的全局函数sort(li.begin(), li.end())这样的排序算法,一般来说,如果不支持全局算法,容器本身会提供类似的算法。这里li.sort(),就是链表容器本身提供的排序算法。

    测试结果

    这回如果要实现降序,怎么做,就用用到sort()第二个重载函数,里面参数传入的是一个函数名称,这个函数是我们自己实现。

    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    
    
    void printList(const list<int>& l)
    {
        for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    
    }
    
    
    bool myCompare(int v1, int v2)
    {
        // 降序,只需要v1 > v2
        return v1 > v2;
    }
    
    void test01()
    {
        // list 大小
        list<int> li;   // 默认构造函数
    
        // 尾部加数据
        li.push_back(50);
        li.push_back(20);
        li.push_back(10);
        li.push_back(30);
        li.push_back(40);
        printList(li);
    
        // 排序操作
        li.sort(myCompare);
        cout << "after sort :" << endl;
        printList(li);
    
    }
    
    int main()
    {
        test01();
        system("pause");
        return 0;
    }

    测试结果

    展开全文
  • 链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。 头指针概念的理解,这个很重要。“链表中第一个结点的...
    • 单链表也是一种线性表,所以总得有个头有个尾。链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。
      • 头指针概念的理解,这个很重要。“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针。画一个图吧。

      • 在线性表的链式存储结构中,头指针是指链表指向第一个结点的指针,若链表有头结点,则头指针就是指向链表头结点的指针。
      • 头指针具有标识作用,故常用头指针冠以链表的名字。
      • 无论链表是否为空,头指针均不为空。头指针是链表的必要元素。 
      头指针 指示链表中第一个结点(即第一个数据元素的存储映像)的存储位置。是必须的
    • 有时在单链表的第一个结点之前附设一个结点,称之为头结点 头结点的数据域可以不存储任何信息,也可以存储如线性表长度等类的附加信息。

    •      头结点不是必须的;此时头指针指向头结点;
    展开全文
  • 作业1:  用户从控制台输入一篇文章,输入完成以后,  将文章保存到桌面,文件名由用户输入。  判读文章中一共有多少个单词?  char txt[2000];... hello lili,hello ... 实现学生信息结构体定义  姓名
  • c++链表

    千次阅读 2017-10-25 19:29:47
    链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。 这里有个地方要注意,就是对头指针概念的理解,这个很重要
  • C++链表模板 实现(复数的链式存取、排序、动态释放内存) 这个是一个简洁明了的程序。 其中链表的排序用了两种冒泡排序方式。
  • 单链表 单链表是一种链式存取的数据结构,用一组地址...链表的存取必须从头指针开始,头指针指示链表的第一个结点(即第一个数据元素的存储映像,也称首元结点)。同时,最后一个数据元素没有直接后继,最后一个结...
  • 链表的操作很容易理解,直接上代码 #include #include <stdio.h> #include <stdlib.h> #include #define NULL 0 using namespace std; struct Book { int id; char name[20]; char author[20]; char ...
  • 现在我只能求助于各位大神,希望大家能够帮我看看到底是出了什么问题,当然顺便再和我说说关于c语言的链表的知识就更好了(当然,我是绝对不敢要求各为大佬的,只是我的一个小小的请求)最后 拜托了 希望大佬们把我...
  • 数组与链表的区别

    2020-03-18 21:36:04
    链表的物理存储位置不确定,一般是分散的 存储空间:链表由于带有指针域,存储密度不如数组大 按序号查找:数组可以随机访问,时间复杂度为 O(1);链表不支持随机访问,平均需要 O(n);  按值查找:若数组无序,...
  • 一、HashMap存取效率高原因 1、Hash 也叫散列、哈希。 主要用于信息安全领域中算法,把长度不同信息转化为杂乱128位编码,找到一种数据内容与地址之间映射关系。 注意:不同输入可能会散列成...
  • 链表的存取操作必须是从头指针开始操作,通过循环遍历逐渐找到第i个结点的位置。 头结点与其后面的有效结点一样,由数据域和指针域组成,不过头结点的数据域一般不存储任何数据,其只是方便对第一个有效结点进行操作...
  • 线性链表的存储结构,整个链表的存取必须从头结点开始。 头指针指向头结点,头结点的数据域不存放任何数据,也可以存储线性表长度等信息,头结点的指针域存储指向第一个节点的指针。 头结点的作用: 防止单链表...
  • 链表

    2019-06-13 15:42:00
    链表是一种物理存储单元上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表指针实现链表由一系列结点组成,结点可以在运行时动态生成,而且由于没有闲置...二、链表缺点:存取速度很慢 三、链...
  •  添加一个名为RWTest表到 SQL Server MYTest 数据库。 表字段设置如下: a. 唯一标识字段名称为"ID",类型为Int。 b. 名称为"Description"VarChar类型字段,字段长度为50。 c. 名称为"Data" varbinary...
  • 顺序表和链表的比较

    千次阅读 2020-06-14 17:53:39
    2.6 顺序表和链表的比较   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部分平台一直在盗取博...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,537
精华内容 1,014
关键字:

链表的存取