想把学生信息存储到链表里,再把链表里的信息再存放到文件里
想问一下这么写函数有什么问题嘛?
void add_lessonmessage()
{
FILE *fp;
fp=fopen("file4.txt","r");
if(fp==NULL)
{
printf("打开文件失败");
exit(1);
}
int n=0;
LES *p,*q;
LES *head=NULL;
head=malloc(sizeof(LES));
head->next=NULL;
q=head;
int i;
for(i=0;i<100;i++)
{
p=malloc(sizeof(LES));
p->next=NULL;
q->next=p;
q=p;
}
LES *p1;
int num=0;
p1=head->next;
fread(p1,sizeof(LES),1,fp);
num++;
while(!feof(fp))
{
num++;
p1=p1->next;
fread(p1,sizeof(CHO),1,fp);
}
fclose(fp);
p1=p1->next;
printf("请输入录入课程信息数量\n");
scanf("%d",&n);
for(i=num;i<num+n;i++)
{
printf("请输入课程号\n");
scanf("%d",&p1->number);
printf("请输入课程名\n");
scanf("%s",p1->name);
printf("请输入课程学分\n");
scanf("%d",&p1->score);
printf("请输入课程学时\n");
scanf("%d",&p1->time);
p1=p1->next;
}
fp=fopen("file4.txt","r+");
p1=head->next;
for(i=0;i<num+n;i++)
{
fwrite(p1,sizeof(LES),1,fp);
p1=p1->next;
}
fclose(fp);
写入文件的数据类型未来有变化嘛?链表也有问题,末尾没有指向
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这段代码中有几个问题:
1.在创建链表时,你创建了 100 个节点,这样浪费了空间。链表应该是动态增长的,只创建需要的节点即可。
2.在读取文件时,你使用了 fread
函数,但是该函数只能读取二进制文件,而不能读取文本文件。如果你的文件是文本文件,应该使用 fgets
等函数进行读取。
3.在读取文件时,你只读取了第一个节点的信息,而没有读取后面的节点信息。正确的做法是使用循环读取每个节点的信息。
4.在写入文件时,你使用了 fopen("file4.txt", "r+")
,这样会打开文件并将文件指针指向文件开头,但是这样会将文件中原有的内容覆盖掉。如果你想在文件末尾添加内容,应该使用 fopen("file4.txt", "a")
。
下面是修改后的代码:
typedef struct lesson LES;
struct lesson {
int number;
char name[20];
int score;
int time;
LES *next;
};
void add_lessonmessage()
{
FILE *fp;
fp=fopen("file4.txt","a");
if(fp==NULL)
{
printf("打开文件失败");
exit(1);
}
int n=0;
LES *p,*q;
LES *head=NULL;
head=malloc(sizeof(LES));
head->next=NULL;
q=head;
printf("请输入录入课程信息数量\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
p=malloc(sizeof(LES));
printf("请输入课程号\n");
scanf("%d",&p->number);
printf("请输入课程名\n");
scanf("%s",p->name);
printf("请输入课程学分\n");
scanf("%d",&p->score);
printf("请输入课程学时\n");
scanf("%d",&p->time);
p->next=NULL;
q->next=p;
q=p;
}
p=head->next;
while(p != NULL)
{
fwrite(p,sizeof(LES),1,fp);
p=p->next;
}
fclose(fp);
}
在这个修改后的代码中,先创建一个头结点,然后依次输入每个节点的信息,将新节点插入到链表的末尾。最后将链表中的所有节点信息写入文件中,并在写入文件时使用了 "a" 模式打开文件,这样可以将新的信息添加到文件末尾,而不会覆盖掉文件中原有的内容。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
不知道你这个问题是否已经解决, 如果还没有解决的话:①定义:首先是一个数组,其次这个数组中存放的是函数指针
②格式:
通过计算器程序来进一步理解:
#include<stdio.h>
#include<stdlib.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("*************************\n");
printf("**** 1.加法 2.减法 ****\n");
printf("**** 3.乘法 2.除法 ****\n");
printf("**** 0.退出 ****\n");
}
int main()
{
int input = 0;
do{
menu();
int x = 0;
int y = 0;
int ret = 0;
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入要处理的两个数字:");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("请输入要处理的两个数字:");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("请输入要处理的两个数字:");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("请输入要处理的两个数字:");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
/*printf("ret = %d\n", ret);*/
} while (input);
return 0;
}
图解:
通过简化函数指针数组优化:
#include<stdio.h>
#include<stdlib.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("*************************\n");
printf("**** 1.加法 2.减法 ****\n");
printf("**** 3.乘法 2.除法 ****\n");
printf("**** 0.退出 ****\n");
}
int main()
{
int input = 0;
do{
int x = 0;
int y = 0;
int ret = 0;
menu();
int(*pArr[5])(int, int) = { NULL, Add, Sub, Mul, Div };
printf("请输入你的选择:\n");
scanf("%d", &input);
if (input > 0 && input <= 4)
{
printf("请输入处理的两个数字:\n");
scanf("%d %d", &x, &y);
ret = (pArr[input])(x, y);
printf("ret = %d\n", ret);
}
else if (input == 0)
{
printf("退出程序\n");
break;
}
else
{
printf("选择错误,请重新输入\n");
}
} while (input);
return 0;
}
图解:
首先,需要明确使用的编程语言是什么,这样可以更具体地提供解决方案。假设我们使用的是Python语言。
如果要存储学生信息到链表,可以先定义一个Student类,包含学生的各种信息,比如姓名、年龄、性别、学号等等。然后,可以定义一个Node类来表示链表的节点,每个节点包含一个Student类的实例和一个指向下一个节点的指针。
下面是一个示例代码:
class Student:
def __init__(self, name, age, gender, student_id):
self.name = name
self.age = age
self.gender = gender
self.student_id = student_id
class Node:
def __init__(self, data):
self.data = data
self.next = None
接下来,可以定义一个LinkedList类来操作链表。比如,可以定义add_node方法来向链表中添加一个节点,定义search_node方法来查找一个节点,定义delete_node方法来删除一个节点,等等。
下面是一个示例代码:
class LinkedList:
def __init__(self):
self.head = None
def add_node(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
curr_node = self.head
while curr_node.next is not None:
curr_node = curr_node.next
curr_node.next = new_node
def search_node(self, student_id):
curr_node = self.head
while curr_node is not None:
if curr_node.data.student_id == student_id:
return curr_node.data
curr_node = curr_node.next
return None
def delete_node(self, student_id):
if self.head is None:
return
if self.head.data.student_id == student_id:
self.head = self.head.next
return
curr_node = self.head
while curr_node.next is not None:
if curr_node.next.data.student_id == student_id:
curr_node.next = curr_node.next.next
return
curr_node = curr_node.next
def display(self):
curr_node = self.head
while curr_node is not None:
print(curr_node.data.name, curr_node.data.age, curr_node.data.gender, curr_node.data.student_id)
curr_node = curr_node.next
最后,可以将链表中的信息存储到文件里。可以使用Python内置的open函数来打开文件,使用write方法来将链表中的信息写入文件。需要注意的是,需要将信息转换成字符串格式才能写入文件。
下面是一个示例代码:
def save_to_file(linked_list, file_name):
with open(file_name, 'w') as f:
curr_node = linked_list.head
while curr_node is not None:
data_str = ','.join([curr_node.data.name, str(curr_node.data.age), curr_node.data.gender, str(curr_node.data.student_id)])
f.write(data_str)
f.write('\n')
curr_node = curr_node.next
这样,就可以实现将学生信息存储到链表里,再将链表里的信息存放到文件里的功能了。