一、思维导图
![](https://i-blog.csdnimg.cn/direct/0679be64cedb4563952c2d200f801f4f.png)
二、1:使用 fputc 和 fgetc 实现文件的拷贝功能
#include <myhead.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{
FILE *rfp = fopen(argv[1], "r");
FILE *wfp = fopen(argv[2], "w");
if(rfp == NULL || wfp == NULL)
{
perror("fopen");
return 1;
}
while(1)
{
int ch = fgetc(rfp);
if(EOF == ch)
break;
fputc(ch, wfp);
}
fclose(wfp);
fclose(rfp);
return 0;
}
2:将结构体数组的加载保存的代码,把结构体数组改成链表再来一次
#include <myhead.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
//定义一个学生信息的结构体类型
typedef struct student
{
char name[20];
int chinese;
int math;
int english;
}student;
//定义一个单向链表的结构体类型
typedef struct Node
{
union
{
int len;
student stu; //嵌套了一个结构体数组
};
struct Node *Next;
}linkList, *linkListPtr;
//申请节点 封装数据
linkListPtr Node_create(char n[], int c, int m, int e)
{
linkListPtr N = (linkListPtr)malloc(sizeof(linkList));
N->stu.chinese = c;
N->stu.math = m;
N->stu.english = e;
strcpy(N->stu.name, n);
N->Next = NULL;
return N;
}
//头插
void Head_insert(linkListPtr L, char n[], int c, int m, int e)
{
linkListPtr N = Node_create(n, c, m, e);
N->Next = L->Next;
L->Next = N;
L->len++;
}
//尾删
void Tail_delet(linkListPtr L)
{
linkListPtr p = L;
for(int i=0; i<L->len-1; i++)
p = p->Next;
linkListPtr q = p->Next;
p->Next = q->Next;
free(q);
q = NULL;
L->len--;
}
int main(int argc, const char *argv[])
{
//在堆区申请节点大小的空间 头结点
linkListPtr L = (linkListPtr)malloc(sizeof(linkList));
L->len = 0;
L->Next = NULL;
printf("创建链表成功!\n");
//头插
Head_insert(L, "Jack", 66, 92, 74);
Head_insert(L, "Link", 43, 35, 64);
Head_insert(L, "Mark", 54, 88, 45);
Head_insert(L, "Rock", 91, 42, 67);
Head_insert(L, "Mike", 75, 58, 79);
FILE *wfp = fopen(argv[1], "w");
if(wfp == NULL)
{
perror("fopen");
return 1;
}
linkListPtr p = L;
for(int i=0; i<5; i++)
{
p = p->Next;
fprintf(wfp, "%s %d %d %d\n", p->stu.name, p->stu.chinese, p->stu.math, p->stu.english);
}
fclose(wfp);
//销毁链表
while(L->Next != NULL)
Tail_delet(L);
free(L);
L = NULL;
printf("销毁成功!\n");
FILE *rfp = fopen(argv[1], "r");
//创建新链表
linkListPtr I = (linkListPtr)malloc(sizeof(linkList));
I->len = 0;
I->Next = NULL;
printf("创建链表成功!\n");
while(1)
{
student s;
fscanf(rfp, "%s %d %d %d\n", s.name, &s.chinese, &s.math, &s.english);
Head_insert(I, s.name, s.chinese, s.math, s.english);
if(feof(rfp) == 1)
break;
}
fclose(rfp);
//遍历
linkListPtr q = I;
for(int i=0; i<I->len; i++)
{
q = q->Next;
printf("Name:%s\n", q->stu.name);
printf("Chinese:%d\n", q->stu.chinese);
printf("Math:%d\n", q->stu.math);
printf("English:%d\n", q->stu.english);
printf("--------------\n");
}
return 0;
}