[C++系列] 算法与数据结构 day01 文件位置指针,链表,数据结构
in C/C++ with 0 comment

[C++系列] 算法与数据结构 day01 文件位置指针,链表,数据结构

in C/C++ with 0 comment

#练习

编写程序从person.bin 文件里获得所有人员信息并显示在屏幕上。

#include<stdio.h>
typedef struct {
    int id;
    float salary;
    char name[10];
}person;
int main(){
    int size;
    person prsn ;
    FILE *p_file = fopen("info.bin","rb");
    if(p_file){
        while(1){
            size = fread(&prsn,sizeof(person),1,p_file);
            if(!size){
                break;
            }
            printf("姓名:%s\n",prsn.name);
            printf("id是:%d\n",prsn.id);
            printf("工资:%g\n",prsn.salary);
        }
        fclose(p_file);
        p_file = NULL;
    }
    return 0;
}

#文件位置指针

计算机中为每个文件保留了一个整数,这个整数表示下一次读写操作的开始位置。
这个位置一定在两个相邻字节之间。
这个整数代表文件头到这个位置之间所包含的字节个数
这个整数叫做文件的位置指针
每当从文件里得到n个字节或向文件里写入n个字节后位置指针都会向后移动n个位置

ftell函数 可以获得当前位置指针的数值。
rewind 函数可以把位置指针的数值设为0。
fseek 函数可以把位置指针设置到文件里的任何位置。
fseek 函数需要选择一个基准位置并且还要指定目标位置到基准位置之间的距离。

SEEK_SET 0 表示把文件头作为基准位置
SEEK_CUR 1 表示把当前位置作为基准位置。
SEEK_END 2 表示把文件尾作为基准位置。

如果目标位置在基准位置后边则距离用非负数表示
如果目标在基准位置前面则距离用负数表示。

距离的绝对值就是两个位置之间包含的字节个数。

练习

编写程序从person.bin文件里获得所有人的id,并显示在屏幕上。

#include<stdio.h>
typedef struct {
    int id;
    char name[10];
    float salary;
}person;
int main(){
    int size,id;
    person prsn ;
    FILE *p_file = fopen("info.bin","rb");
    if(p_file){
        /*
        fread(&prsn,sizeof(prsn),1,p_file);
        printf("id is : %d\n",prsn.id);
         fseek(p_file,sizeof(prsn)+1,SEEK_CUR);
        printf("id is : %d\n",prsn.id);
        */
        while(1){
        size = fread(&id,sizeof(int),1,p_file);
        if(!size){
            break;
        }
        printf("id is:%d\n",id);
        fseek(p_file,sizeof(prsn)-sizeof(int),SEEK_CUR);
        }
        fclose(p_file);
        p_file = NULL;
    }
    return 0;
}

cp 命令 实现文件拷贝
cp 文件路劲一 文件路径二
路劲一代表一个存在的文件,路径二代表一个不存在的文件。 命令执行结束,命令二文件出现,它的内容和路径一代表的文件内容一样。
-R 可以拷贝目录

#数据结构

数据结构研究如果使用存储区。
算法研究解决一些通用问题的常用方法。

数字之间的关系可以从两个不同的角度描述。
1,逻辑关系(逻辑结构)描述数字之间和计算机无关的东西。
2,物理关系(物理结构)描述存放数字与存储区之间的关系

逻辑结构分为以下几种:

1,集合结构:所有数字可以被看作一个整体。
2,线性结构:可以用一条有顺序的线把所有数字串联起来
3,树状结构:所有数字从一个数字扩展出多个其他数字。
4,网状结构:任何两个数字之间都可以有直接的联系,数字之间的联系没有统一的方向。

物理结构有以下两种:

1,顺序结构:所有存储区在内存里连续排列。数组和动态分配内存都是顺序结构的例子。顺序结构里每个存储区都有一个编号,顺序结构里可以直接通过编号找到对应的存储区。

                     可以通过编号找到顺序结构里的存储区(不需要通过其他存储区),这种能力叫随机访问能力。  顺序结构的大小很难调整,这会造成存储区的浪费。
                     顺序结构不适合进行插入,删除操作。

2,链式结构:由多个相互独立的存储区构成,任何两个存储区之间都可以用指针连接。链式物理结构里每个存储区都是一个结构体类型的存储区,它们叫做节点。

                     单向线性链式物理结构中任何两个节点之间都有前后顺序(每个节点里只需要包含一个指针),单向线性链式物理结构中最后一个节点里的指针必须是空指针。
                     可以在最前面有效节点的前面再增加一个无效节点,这个节点叫做头节点(它不用来记录数字),可以在最后一个有效节点的后面再增加一个无效节点,这个节点叫做尾结点(它也不用来记录数字)

#练习

在下面数字组中插入11

2 4 6 8 10 12 14 16 0 0 0

11

#include<stdio.h>
void insert(int *p_num,int size,int val){
     int num=0;int val1=val;int tmp;
     for(num=0;num <= size-1;num++){
        if(*(p_num+num)>val1){
            tmp = *(p_num+num);
            *(p_num+num)=val1;
            val1= tmp;
        }else if(!*(p_num+num)){
            *(p_num+num)=val1;
            break;
        }
     }
}
int  main(){
    int val,num=0;
    int arr[] = {2,4,6,8,10,12,14,16,0,0,0};
    printf("输入一个数字:");
    scanf("%d",&val);
    insert(arr,11,val);
    for(num=0;num<=10;num++){
            printf("%d ",arr[num]);
    }
    printf("\n");
return 0;
}

#链式结构举例 示例代码

#include<stdio.h>
typedef struct node{
    int num;
    struct node *p_next; //结构体指针指向下一结构体
}node;  
int main(){
    node node1 = {3},node2={8},node3={14},head = {0},tail={0},*p_node=NULL;
    node1.p_next = &node2;
    node2.p_next = &node3;
    head.p_next = &node1;
    node3.p_next = &tail;
    for(p_node =&head;p_node!=&tail;p_node=p_node->p_next){
            //在循环里p_node指针会从头节点捆绑到最后一个有效节点
            node *p_first =p_node;//变化范围和指针循环变量一样
            node *p_mid = p_first->p_next;//变化范围从第一个有效节点到尾节点
            node *p_last = p_mid ->p_next;
            if(p_mid!=&tail){
                //p_mid指针不是和尾节点捆绑的时候。
                printf("%d ",p_mid->num);
            }
    }
    printf("\n");
    return 0;
}

#练习

修改上面程序,统计线性链式物理结构里有效节点的个数。

#预习

 1,链式物理结构
 2,栈
 3,队列
Responses