求教 为什么会出现乱码

apocalyps3 2015-12-29 11:00:05
#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef struct
{
char name[20];
char number[15];
float Chinese;
float Math;
float English;
float average;

}DATA;

typedef struct node
{
DATA data;
struct node *next;
}Linklist;

Linklist *LinklistAdd( Linklist *head, DATA data )
{
Linklist *node;
node = (Linklist*)malloc(sizeof(Linklist));
node->data.Chinese = data.Chinese;
node->data.Math = data.Math;
node->data.English = data.English;
strcpy(node->data.number, data.number);
strcpy(node->data.name, data.name);
if( head == NULL )
{
head = node;
head->next = NULL;
}
else
{
node->next = head->next;
head->next = node;
}
return head;
}

Linklist *LinklistFind( Linklist *head, char *findnumber )
{
Linklist *h;
h = head;
while( h )
{
if( strcmp(h->data.name, findnumber) == 0 )
return h;
h = h->next;
}
return NULL;
}


int LinklistDelete( Linklist *head, char *number )
{
Linklist *node, *h, *temp;
int flag = 1;
node = h = head;
while( h )
{
if( strcmp(h->data.name, number) == 0 )
{
if(flag == 1)
{
temp = h->next;
free(h);
h = temp;
return 1;
}
else
{
flag = 0;
temp = h->next;
free(h);
node->next = temp;
h = temp;
return 1;
}
}
else
{
if( flag == 1)
{
h = h->next;
flag = 0;
}
else
{
node = h;
h = h->next;
}
}
}
printf("\n没有找到姓名为%s的学生信息!\n", number);
return 0;
}

void LinklistDisplay(Linklist *head)
{
Linklist *h=head;
DATA *data;
while(h)
{
data=&h->data;
printf("%10s%10s%10s%10s%10s%10s\n","姓名","学号","语文成绩","数学成绩","英语成绩","平均成绩");
printf("**************************************************************\n");
printf("%10s%10s%10g%10g%10g%10g\n",data->name, data->number, data->Chinese, data->Math, data->English, data->average);
h=h->next;
}

}


Linklist* Input(Linklist *head)
{
Linklist *u = (Linklist*)malloc(sizeof(Linklist));
printf ("请输入添加学生的信息:\n");
printf("请输入姓名:");
scanf("%s",u->data.name);
printf("请输入学号: ");
scanf("%s",u->data.number);
printf("请输入语文成绩: ");
scanf("%f",&u->data.Chinese);
printf("请输入数学成绩: ");
scanf("%f",&u->data.Math);
printf("请输入英语成绩: ");
scanf("%f",&u->data.English);
u->data.average = (u->data.Chinese + u->data.English + u->data.Math)/3;
Linklist *h = head,*t = NULL;
while(h)
{
if(h->data.average < u->data.average)
break;
else
{
t = h;
h = h->next;
}
}
u->next = h;
if( !t )
return u;
t->next = u;
return head;

}

void Find(Linklist *head)
{
DATA data;
char name[20];
Linklist *h;
printf("请输入要查找的学生的姓名:");
scanf("%s", name);
h = LinklistFind(head, name);
if( h )
{
data = h->data;
printf("要查找的学生的信息为:\n");
printf("%10s%10s%10s%10s%10s%10s\n","姓名","学号","语文成绩","数学成绩","英语成绩","平均成绩");
printf("**************************************************************\n");
printf("%10s%10s%10g%10g%10g%10g\n",data.name, data.number, data.Chinese, data.Math, data.English, data.average);
}
else
{
printf("\t没有找到姓名为%s的学生信息!\n", name);
}
}

void Delete(Linklist *head)
{
char name[20];
printf("请输入要删除的学生的姓名:");
scanf("%s", name);
LinklistDelete(head, name);
}

void write(Linklist *head)
{
FILE *fp;
Linklist *p;
fp=fopen("c:\\1.txt","w");
p=head;
while(p!=NULL)
{
fprintf(fp,"%s %s %g %g %g %g\n",p->data.name, p->data.number, p->data.Chinese, p->data.Math, p->data.English, p->data.average);
printf("%s %s %g %g %g %g\n",p->data.name, p->data.number, p->data.Chinese, p->data.Math, p->data.English, p->data.average);
p=p->next;
}
fclose(fp);
}

Linklist* read(Linklist *head)
{
Linklist *p1,*p2;
FILE *fp;
fp=fopen("c:\\1.txt","r");
p1=p2=head=NULL;
int x=1;
while(!feof(fp))
{
p1=(Linklist *)malloc(sizeof(Linklist));
fscanf(fp,"%s%s%f%f%f%f",p1->data.name, p1->data.number, &p1->data.Chinese, &p1->data.Math, &p1->data.English, &p1->data.average);
if(p2) p2->next=p1;
if(x==1) head=p1;
x++;
p2=p1;
}
p2->next=NULL;
fclose(fp);
return head;
}


int main()
{
Linklist *head = NULL;
head=read(head);
int option=1;
while(option!=5)
{
printf("\n*********************************\n");
printf("|\t \t|\n");
printf("|\t1.添加学生的信息\t|\n");
printf("|\t \t|\n");
printf("|\t2.按成绩排序 \t|\n");
printf("|\t \t|\n");
printf("|\t3.查找学生的信息\t|\n");
printf("|\t \t|\n");
printf("|\t4.删除学生的信息\t|\n");
printf("|\t \t|\n");
printf("|\t5.退出 \t|\n");
printf("|\t \t|\n");
printf("*********************************\n");
printf("\n请选择:");
scanf("%d",&option);
switch(option)
{
case 1:
Input(head);
break;
case 2:
LinklistDisplay(head);
break;
case 3:
Find(head);
break;
case 4:
Delete(head);
break;
case 5:
break;
default:
break;
}
getchar();
}
write(head);
return 0;
}



...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2015-12-30
  • 打赏
  • 举报
回复
引用 2 楼 apocalyps3 的回复:
[quote=引用 1 楼 paschen 的回复:]
你把问题说清楚,你"c:\\1.txt","r" 文件内容是什么,要怎么输入会出现乱码,然后我帮你看一下


我想要把输入的学生信息存到文本里。可是我不太会链表,有错误。[/quote]

你还是没说重点,你"c:\\1.txt","r"这个文件里的内容是什么
你输出的这几个数都是来自文本,要你文本有内容

比如我测试的;

文本内容如下:


显示:

apocalyps3 2015-12-30
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
你把问题说清楚,你"c:\\1.txt","r" 文件内容是什么,要怎么输入会出现乱码,然后我帮你看一下
我想要把输入的学生信息存到文本里。可是我不太会链表,有错误。
赵4老师 2015-12-30
  • 打赏
  • 举报
回复
请检查fscanf函数的返回值。
linzertling 2015-12-30
  • 打赏
  • 举报
回复
如果你文本文件里边能够输出结果,那么说明程序没问题,但是出现乱码就说明保存的数据有问题,检查一下是否保存的是想要保存的数值,有可能你是把变量地址搞错了
paschen 2015-12-29
  • 打赏
  • 举报
回复
你把问题说清楚,你"c:\\1.txt","r" 文件内容是什么,要怎么输入会出现乱码,然后我帮你看一下

69,382

社区成员

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

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