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;

#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct subject long num; // 课程编号 char name[20]; // 课程名称 char kind[15]; // 课程性质 int period_1; // 授课学时 int c_period_2; // 实验或上机学时 float score; // 课程学分 int term; // 开课学期 struct subject *next; ; struct subject *c_head; void save() // 课程数据存入文件 FILE *fp; struct subject *p1=c_head; if((fp=fopen("wan.txt","w"))==NULL) printf("open error\n"); return; for(;p1;p1=p1->next) fprintf(fp,"%ld\n%s\n%s\n%d\n%d\n%f\n%d\n",p1->num,p1->name,p1->kind,p1->period_1,p1->period_2,p1->score,p1->term); fclose(fp); void input() // 录入课程信息(动态链表) struct subject *p1,*p2; n=5; //录入5条记录 clrscr(); printf("Please input the information of course:\nnum\tname\tkind\tperiod_1\tperiod_2\tscore\tterm\n"); 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; printf("\nNow press any key to save "); getch(); save(); return; int main() float pyy,*yy=&pyy; input(); return 0;
//我的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; //建立链表试试这个

参考技术A 才学习啊,觉得C挺有趣的。追问

你也学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语言问题,求解释(关于动态链表和文件写入):的主要内容,如果未能解决你的问题,请参考以下文章

C语言问题,求解释

用VC读取DXF文件,用了DxfReader的部分代码,结果出问题了,求解释啊

静态链表和动态链表的区别

动态链表和静态链表

编写C语言程序创建一个具有10个结点的单链表并输出该链表的数据

C语言怎么存链表形式的结构体文件?