用c的结构体和链表写了一个系统,但输入像进行的操作后,无法运行相应程序

之行知生。 2019-01-11 02:37:45
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*定义一个学生类型*/
typedef struct weather
{
char day[11];//日期
int mintem;//最低温度
int maxtem;//最高温度
int rain;//是否下雨下雪
struct weather* next;
}Wea;
Wea* weathers;//链表
char* filmname="weather.txt";//文件
char Day[11];
int min;
int max;
int rai;
void ori();//初始化
void delete_(char* day);//删除信息
void reWrite(void);
void addin(Wea* wea);//插入文本
int add(char* day, int mintem,int maxtem,int rain);//增加信息
void change(char* day, int mintem,int maxtem,int rain);//修改信息
int checkday(char* day);//判断日期输入
void printall();//打印所有信息
Wea* search(char* Day);//查找信息
void menu();//初始界面
//初始化
void ori()
{
weathers= (Wea*)malloc(sizeof(Wea));//给链表的头节点分配内存
weathers->next=NULL;//指向设为空
FILE* fp;
fp=fopen(filmname,"r");//打开信息文件
if (fp==NULL)
{
printf("开文件失败!");
return;
}
Wea* now=weathers;//当前结点
while (1)
{
Wea* wea = (Wea*)malloc(sizeof(Wea));
//从文本读入学生信息,存进stu中
if(fscanf(fp, "%s %d %d %d",&(wea->day) ,&(wea->mintem),&(wea->maxtem))==EOF)
{
//如果读入为EOF,也就说为读入为空,那么刚刚新建的stu就不要了,释放分配的内存
free(wea);
break;
}
wea->next = NULL;

now->next=wea;//将当前节点和新建的节点链接起来
now=wea;//调整当前节点为新节点
}
fclose(fp);
}
//删除
void delete_(char* day)
{
Wea* wea=weathers->next;//当前节点
Wea* wea_=weathers;//当前节点的父节点
int flag= 0;//是否找到学生
while (wea!=NULL)
{
if (strcmp(wea->day,day) == 0)//判断日期是否相同
{
wea_->next=wea->next;
free(wea);
reWrite();//重写进文件
flag=1;
break;
}
wea_=wea_->next;
wea=wea->next;
}
if (flag)
{
printf("成功删除!\n");
}
else
{
printf("找不到该日期的信息!\n");
}
}
//改变节点后重新写如文件
void reWrite()
{
Wea* wea=weathers->next;
FILE* fp = fopen(filmname, "w");//清空文件
fclose(fp);
if (wea==NULL)//这个代表当前没有学生,直接返回
{
return;//
}
while(wea!=NULL)
{
addin(wea);
wea=wea->next;
}

}
//添加的信息写进文本文件
void addin(Wea* wea)
{
FILE* fp;
fp=fopen(filmname,"a");
if (fp==NULL)
{
printf("无法写入文件");
return;
}
fprintf(fp, "%s %d %d %d\n", wea->day,wea->mintem,wea->maxtem,wea->rain);
fclose(fp);
}
//增加信息
int add(char* day, int mintem,int maxtem,int rain)
{
if (!checkday(day))
{
printf("日期重复,不许添加\n");
}
else{
Wea* neww= (Wea*)malloc(sizeof(Wea));//新建一个新节点
neww->next = NULL;//给新节点赋值
strcpy(neww->day, day);
neww->mintem=mintem;
neww->mintem=mintem;
neww->rain=rain;
//调整p到最后一个节点
Wea* p=weathers;
while (p->next!=NULL)
{
p = p->next;
}
//p链接新节点
p->next = neww;
//插入新信息
addin(neww);
}


}
/*修改学生信息*/
void change(char* day, int mintem,int maxtem,int rain)
{
//修改信息是先删除再添加
delete_(day);
if(add(day,mintem,maxtem,rain))
printf("修改成功!");
else
printf("修改失败!");
}
/*判断日期是否重复*/
int checkday(char *day)
{
Wea* wea=weathers->next;
while (wea!=NULL){
if (strcmp(wea->day, day)==0)
return 0;
wea=wea->next;
}
return 1;
}

/*打印所有信息*/
void print(char* day)
{
Wea* wea=weathers->next;
while (wea!=NULL){
if (strcmp(wea->day, day)==0){
printf("%s %d %d %d\n",wea->day,wea->mintem, wea->maxtem,wea->rain);
break;
}
else
wea=wea->next;
}
if(wea==NULL)
printf("找不到该日期信息");
}
/*根据学生信息查找学生*/
void printall()
{
Wea* wea =weathers->next;
while (wea!=NULL)
{
printf("%s %d %d %d\n",wea->day,wea->mintem, wea->maxtem,wea->rain);
wea=wea->next;
}
getchar();
getchar();
}
void menu()
{
printf("#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~\n");
printf("\n 天气信息管理系统\n");
printf(" 王静文 18计算机1班 1800303129\n");
printf("\n#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~\n");
printf("\n I 请选择你想进行的操作: I\n");
printf(" I 1、增加一天天气 I\n");
printf(" I 2、删除一天天气 I\n");
printf(" I 3、修改某天天气 I\n");
printf(" I 4、查询某天天气 I\n");
printf(" I 5、显示所有信息 I\n");
printf(" I 6、保存并退出 I\n");
printf("\n#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~\n");
printf("请输入你的选择:");
}

int main()
{
void ori();
menu();
int n;
while((scanf("%d",&n))!=EOF){
switch (n)
{
case 1:
printf("请输入日期,最低温度,最高温度,是否下雨下雪(例如:1999.11.25 2 12 1)数据以空格隔开1代表肯定2代表否定:\n");
scanf("%s%d%d%d",&Day,&min,&max,&rai);

add(Day,min,max,rai);
break;
case 2:
printf("请输入日期:");
scanf("%s", &Day);
delete_(Day);
break;
case 3:
printf("请输入日期:");
scanf("%s",&Day);
if(checkday(Day)){
printf("找不到该日期的信息,无法修改。");
}
else {
printf("请输入日期与修改后的最低温度,最高温度,是否下雨下雪(例如:1999.11.25 2 12 1)数据以空格隔开1代表肯定2代表否定:");
scanf("%s%d%d%d",&Day,&min,&max,&rai);
change(Day,min,max,rai);
}
break;
case 4:
printf("请输入日期:");
scanf("%s",&Day);
print(Day);
case 5:
printall();
break;
case 6:
exit(0);
break;
}
}
return 0;
}
...全文
45 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
之行知生。 2019-01-11
  • 打赏
  • 举报
回复
也没有将要添加的信息写到文件中

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧