C语言问题,求解释(关于动态链表和文件写入):
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言问题,求解释(关于动态链表和文件写入):相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
struct subject
long c_num; // 课程编号
char c_name[20]; // 课程名称
char c_kind[15]; // 课程性质
int c_period_1; // 授课学时
int c_period_2; // 实验或上机学时
float c_score; // 课程学分
int c_term; // 开课学期
struct subject *next;
;
void c_save() // 课程数据存入文件
FILE *fp;
char a[15];
struct subject *p=c_head;
printf("\nPlease input the file's name: ");
scanf("%s",a);
getchar();
if((fp=fopen(a,"wb"))==NULL)
printf("open error\n");
return;
for(;p;p=p->next)
fwrite(p,sizeof(struct subject),1,fp);
fclose(fp);
void c_input() // 录入课程信息(动态链表)
struct subject *p1,*p2;
n=0;
clrscr();
printf("Please input the information of course:\nnum\tname\tkind\tperiod_1\tperiod_2\tscore\tterm\n");
p1=p2=(struct subject *)malloc(sizeof(struct subject));
scanf("%ld%s%s%d%d%f%d",&p1->c_num,p1->c_name,p1->c_kind,&p1->c_period_1,&p1->c_period_2,&p1->c_score,&p1->c_term);
while(p1->c_num)
m+=1;
if(n==1) c_head=p1;
else p2->next=p1;
p2=p1;
p1=(struct subject *)malloc(sizeof(struct subject));
scanf("%ld%s%s%d%d%f%d",&p1->c_num,p1->c_name,p1->c_kind,&p1->c_period_1,&p1->c_period_2,&p1->c_score,&p1->c_term);
p2->next=NULL;
printf("\nNow press any key to save ");
getch();
c_save();
return;
int main()
float pyy,*yy=&pyy;
c_input();
return 0;
编程环境TC3.0
文件可以创建,但是写入后是空白的。
补充,全局变量定义过 struct subject *c_head;
//我的VC有点问题,没有运行……仅做参考追问
看着有点晕,你直接指处我哪里有错误,该怎么改吧。。。还有,这是在TC下编的。
追答你的链表没有完整的建立起来,没有头……中间的连接有问题……
追问c_head就是链表头啊,中间链接嘛···我没看出问题来·····反正错得很诡异,我自己感觉文件写入那里有问题,就是发现不了···
追答c_head=p1=(struct subject *)malloc(sizeof(struct subject));
scanf("%ld%s%s%d%d%f%d",&p1->num,p1->name,p1->kind,&p1->period_1,&p1->period_2,&p1->score,&p1->term);
while(n--)
p2=(struct subject *)malloc(sizeof(struct subject));
p1->next=p2;
p1=p2;
scanf("%ld%s%s%d%d%f%d",&p1->num,p1->name,p1->kind,&p1->period_1,&p1->period_2,&p1->score,&p1->term);
p1->next=NULL; //建立链表试试这个
你也学C吗?上大一呢?
追答不是啊,就是想学了。
追问你今年多大啊?对计算机有兴趣的话,可以交个朋友吧。
追答可以啊,加QQ811791379
参考技术B cscscs追问正经一点好不好
参考技术C 有报错吗?追问没有报错。你可以运行一下试试。
追答我运行有报错啊
追问我这是截取的我的项目中的一段程序。其中m,n之类的已经定义过了。还有,要在TC下运行,在VC下肯定要出错的。
动态链表和静态链表
参考技术A方式一:链表通常可以使用 结构体+指针 来实现[ 动态链表 ]
这是第一种实现方式,但是这种方式有一些弊端,比如链表添加节点需要 new 一个新的 Node ,new是非常慢的过程,还消耗内存资源。算法题中链表的大小一般是100万级别,单单new出100万个节点就已经会超时了。
方式二:数组模拟链表[ 静态链表 ] 每一个节点提前准备好,没有指针的语言中可以使用
好处:快!而且普通链表的功能比如排序也都有,就是实现起来麻烦一点~。
特点:链表的实现也是可以不借助指针的。
单链表往往需要 head 来指向第一个节点;但是双链表不需要 head ,而是直接使用两个数(0,1)来表示初始左右节点,但是这两个节点里面没有值,注意idx需要从 2 开始。
Acwing: 双链表
实现一个双链表,双链表初始为空,支持 5 种操作:
在最左侧插入一个数;
在最右侧插入一个数;
将第 k 个插入的数删除;
在第 k 个插入的数左侧插入一个数;
在第 k 个插入的数右侧插入一个数
现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。
实现一个双链表,双链表初始为空,支持 5 种操作:
在最左侧插入一个数;
在最右侧插入一个数;
将第 k 个插入的数删除;
在第 k 个插入的数左侧插入一个数;
在第 k 个插入的数右侧插入一个数
现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。
以上是关于C语言问题,求解释(关于动态链表和文件写入):的主要内容,如果未能解决你的问题,请参考以下文章
用VC读取DXF文件,用了DxfReader的部分代码,结果出问题了,求解释啊