问题描述
- 用链表做一个成绩管理系统,记录写在student.txt中,有些问题。望回答。
- #include ""stdio.h""
#include ""io.h""
#include ""malloc.h""
#define MAXSIZE 100
#define LEN 5
typedef char DataType;
typedef struct student{
DataType num[LEN]score[LEN];
DataType name[LEN];
}student;
typedef struct listnode{
student data;
int len;
struct listnode next;
}listnode;
//获得第n个节点
listnode getnode(listnode qint n)
{
int m=0;
listnode *s=q;
if(nq->len)
return NULL;
while(m!=n&&s->next)
{
s=s->next;
m++;
}
if(m==n)
return s;
else
return NULL;
}
//按位置插入并写入文件
void insert(listnode *qint nFILE *fp)
{
listnode *s*r;
int m;
s=(listnode)malloc(sizeof(listnode));
printf(""输入姓名n"");
fflush(stdin);
gets(s->data.name);
printf(""输入学号n"");
fflush(stdin);
gets(s->data.num);
printf(""输入分数n"");
fflush(stdin);
gets(s->data.score);
r=getnode(qn-1);
s->next=r->next;
r->next=r;
fseek(fp(n-1)*sizeof(struct student)0);
fprintf(fpn%stt%stt%sn""s->data.nums->data.names->data.score);
}
//删除记录
void del(int nFILE *fp)
{
listnode *head*s*r;
FILE *fp1;
head=ennc(fp);
s=getnode(headn-1);
r=s->next;
s->next=r->next;
free(r);
fp1=enfile(head);
return fp1;}
//调入内存
listnode* ennc(FILE fp)
{
char ch;
listnode *head*s*r;
head=(listnode)malloc(sizeof(listnode));
head->next=NULL;
r=head;ch=fgetc(fp);
if(ch==EOF)
{
printf(""文件为空按任意键退出n"");
getch();
exit(1);
}
fseek(fp00);
while(ch!=EOF)
{
s=(listnode*)malloc(sizeof(listnode));
r->next=s;
r=s;
r->next=NULL;
fscanf(fp%s%s%sn""s->data.nums->data.names->data.score);
printf(""当前调用的内容是:n"");
printf(""%stt%stt%sttn""s->data.nums->data.names->data.score);
ch=fgetc(fp);
}
return head;
}
//将内存中的内容写入文件
FILE* enfile(listnode *head)
{
listnode *s;
FILE *fp;
if((fp=fopen(""student.txt""wt+""))==NULL)
{
printf(""cannot open student.txt press any key exitn"");
getchar();
exit(1);
}s=head->next;while(s){ fprintf(fp%stt%stt%sn""s->data.nums->data.names->data.score); s=s->next;}return fp;
}
void main()
{
int numi;
char ch;
FILE fp;
student *pp*qq;
listnode *head*s*r;
head=(listnode)malloc(sizeof(listnode));
head->next=NULL;
r=head;
//检查文件是否存在存在则打开不存在则创建
if((_access(""student.txt""0))!=-1)
{
if((fp=fopen(""student.txt""at+""))==NULL)
{
printf(""cannot open student.txtpress any key exitn"");
ch=getchar();
exit(1);
}
}
else
{
if((fp=fopen(""student.txt""wt+""))==NULL)
{
printf(""cannot open student.txt press any key exitn"");
ch=getchar();
exit(1);
}
}
ch=fgetc(fp);
if(ch!=EOF)
{
printf(""文件不为空现在将文件中内容调入内存n"");
while(ch!=EOF)
{
s=(listnode*)malloc(sizeof(listnode));
r->next=s;
r=s;
r->next=NULL;
fseek(fp00);
fscanf(fp%s%s%sn""s->data.nums->data.names->data.score);
printf(""%stt%stt%sn""s->data.nums->data.names->data.score);ch=fgetc(fp);
}
}
//fputs(""学号""fp); fputs(""tt""fp);fputs(""姓名""fp);fputs(""tt""fp);fputs(""成绩""fp);
//创建记录并写入记录到文件
else
{
printf(""文件为空现在录入记录输入你想建立的学生信息记录条数n"");
scanf(""%d""&num);
head->len=num;
for(i=0;i {
s=(listnode*)malloc(sizeof(listnode));
r->next=s;
r=s;
r->next=NULL;
printf(""现在录入第%d个学生的信息输入姓名n""i+1);
fflush(stdin);
gets(s->data.name);
printf(""输入学号n"");
fflush(stdin);
scanf(""%s""&s->data.num);
printf(""输入成绩n"");
fflush(stdin);
scanf(""%s""&s->data.score);
fprintf(fp%stt%stt%sn""s->data.nums->data.names->data.score);
//kong
fseek(fp02);
ch=fgetc(fp);
if(ch==EOF)
printf(""kongn"");
else
printf(""此位置以后为空n"");
/*
r=(listnode*)malloc(sizeof(listnode));
r->next=NULL;
qq=&(r->data);
fseek(fp2*sizeof(struct student)+40);
fscanf(fp%stt%stt%sn""qq->numqq->nameqq->score);
printf(""%stt%stt%sn""qq->numqq->nameqq->score);
/
//fwrite(ppsizeof(struct student)1fp);/
fputs("" n ""fp);
fputs(pp->numfp);fputs(""tt""fp);
fputs(pp->namefp);
fputs(""tt""fp);
fputs(pp->scorefp);
fputs("" n ""fp);
fseek(fp02);
*/
}
}
printf(""输入你要删除的数的序号第几个n"");
scanf(""%d""&num);
//del(fpnum);//rewind(fp);}