新手求救,C程序问题

aliershian 2009-07-01 07:05:44
程序如下,在运行时出现"应用程序出现问题需要关闭",求解答!

#include <stdio.h>
#include <malloc.h>

struct Record { //record
char code[15];
char name[10];
char dep[10];
int mark;
int isEnd;
struct Record *pre;
struct Record *next;
};
struct SaveElement {
char code[15];
char name[10];
char dep[10];
int mark;
int isEnd;
};

//----------Build Record List
void setRewrite (struct Record *,char *);
struct Record *initRecordList ()
{
struct Record *p;
p=(struct Record *)malloc (sizeof (struct Record));
strcpy (p->code,"00000000000");
p->isEnd=1;
return p;
}

void setLocation (struct Record *head,struct Record *elemt)
{
struct Record *tmp,*p;
int chs;
int sign=0;
p=head; //The Head of List
while (1)
{
printf ("*");
if (!strcmp ((p->code),(elemt->code))) //
{
printf ("This Record is Alrealy here!\nSo do you want to rewrite it? (1/0):");
scanf ("%d",&chs);
if (chs)
{
setRewrite (head,elemt->code);
}
sign=1;
break;
}
if ((strcmp ((p->code),(elemt->code)))>0) //p>e
{
printf ("^\n");
tmp=p->pre;
printf ("tmp->code:%s",tmp->code);
tmp->next=elemt;
elemt->pre=tmp;
elemt->next=p;
p->pre=elemt;
elemt->isEnd=0;
sign=1;
printf ("Record Added!\n");
break;
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
p->next=elemt;
elemt->pre=p;
p->isEnd=0;
elemt->isEnd=1;
printf ("elemt->code=%s",elemt->code);
printf ("Record Added!\n");
}
}

void addNewRecord (struct Record *head)
{
struct Record *p;
p=(struct Record *)malloc (sizeof (struct Record));

printf ("Input Student's Depertment:");
scanf ("%s",p->dep);
printf ("\nInput Student's Code:");
scanf ("%s",p->code);
printf ("\nInput Student's Name:");
scanf ("%s",p->name);
printf ("\nInput Student's mark:");
scanf ("%d",&p->mark);
setLocation (head,p);

}

struct SaveElement * setRecordCopy (struct Record *elemt)
{
struct SaveElement *element;
element=(struct SaveElement *)malloc (sizeof (struct SaveElement));
strcpy ((element->code),(elemt->code));
strcpy ((element->name),(elemt->name));
strcpy ((element->dep),(elemt->dep));
element->mark=elemt->mark;
element->isEnd=elemt->isEnd;
return element;
}

struct Record * getRecordCopy (struct SaveElement * elemt)
{
struct Record *p=(struct Record *)malloc (sizeof (struct Record));
strcpy ((p->code),(elemt->code));
printf ("Inside p->code=%s\n",p->code);
strcpy ((p->name),(elemt->name));
strcpy ((p->dep),(elemt->dep));
p->mark=elemt->mark;
p->isEnd=elemt->isEnd;
return p;
}

//------------Function

void searchRecord_Code (struct Record *head,char *code)
{
int sign;
struct Record *p;
sign=0;
p=head;
while (1)
{
if (!strcmp (p->code,code))
{
printf ("Got it!\n");
printf ("Code:%s\n",p->code);
printf ("Name:%s\n",p->name);
printf ("Mark:%d\n",p->mark);
sign=1;
break;
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
printf ("Sorry,I can't find the record!\n");
}
}

void searchRecord_Name (struct Record *head,char *name)
{
int sign;
struct Record *p;
sign=0;
p=head;
while (1)
{
if (!strcmp (p->name,name))
{
printf ("Got it!\n");
printf ("Code:%s\n",p->code);
printf ("Name:%s\n",p->name);
printf ("Mark:%d\n",p->mark);
sign=1;
break;
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
printf ("Sorry,I can't find the record!\n");
}
}

void setRewrite (struct Record *head,char *code)
{
int sign;
struct Record *p;
sign=0;
p=head;
while (1)
{
if (!strcmp (p->code,code))
{
printf ("Code:%s\n",p->code);
printf ("Name:%s\n",p->name);
printf ("Input new mark:");
scanf ("%d",&p->mark);
printf ("Ok!");
sign=1;
break;
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
printf ("Sorry,I can't find the record which you want!\n");
}
}

void viewAll (struct Record *head)
{
struct Record *p;
p=head->next;
printf ("\nDepartment Code Name Mark\n");
printf ("===============================================================\n");
while (1)
{
printf ("%s",p->dep);
printf (" %s",p->code);
printf (" %s",p->name);
printf (" %d\n",p->mark);
if (p->isEnd)
{
break;
}
p=p->next;
}
printf ("===============================================================\n");
}

void delRecord (struct Record *head,char *code)
{
int sign;
struct Record *p,*tmp;
sign=0;
p=head;
while (1)
{
if (!strcmp (p->code,code)&&!(p->isEnd))
{
tmp=p->pre;
p->pre->next=p->next;
free (p);
sign=1;
printf ("Delete successful!\n");
break;
}
if (!strcmp (p->code,code)&&(p->isEnd))
{
p->pre->isEnd=1;
free (p);
sign=1;
printf ("Delete successful!\n");
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
printf ("Sorry,I can't find the record which you want!\n");
}
}

//----------------File
void setFile (struct Record *head)
{
FILE *f_p;
struct Record *p=head;
struct SaveElement *tmp;
f_p=fopen ("Data.dt","wb");
while (1)
{
tmp=setRecordCopy (p);
fwrite (tmp,sizeof (struct SaveElement),1,f_p);
if (p->isEnd)
{
break;
}
p=p->next;
}
printf ("\nSave finished!");
fclose (f_p);
}

struct Record * getFile ()
{
FILE *f_p;
struct Record *p,*head;
struct SaveElement *get;
head=initRecordList ();

if ((f_p=fopen ("Data.dt","rb"))!=NULL)
{
fread (get,sizeof (struct SaveElement),1,f_p); //pass the sign Elemnt
printf ("pt");
while (1)
{
if (get->isEnd)
{
break;
}
printf ("!");
fread (get,sizeof (struct SaveElement),1,f_p);
p=getRecordCopy (get);
printf ("get->code:%s\n",get->code);
printf ("p->code:%s\n",p->code);
setLocation (head,p);
}
printf ("Read File successful!\n");
}
printf ("head->code:%s",head->code);
fclose (f_p);
//return head;
}

//----------------UI
void setUI (struct Record *head)
{
int choose;
int ch;
char input[15];
printf (" Student mark manage System \n");
printf (" Ver 1.0 \n");
printf (" ===========================================================\n");
printf (" 1 Add Record \n");
printf (" 2 Search Record \n");
printf (" 3 Scan All Record \n");
printf (" 4 Delete Record \n");
printf (" 5 Save RecordList \n");
printf (" 6 About \n");
printf (" 0 Quit \n");
printf (" ===========================================================\n");
printf (" Choose:");
scanf ("%d",&choose);
switch (choose)
{
case 1:
while (1)
{
addNewRecord (head);
printf ("\nContinue? (1/0):");
scanf ("%d",&ch);
if (!ch)
{
break;
}
}
break;
case 2:printf ("1 - Search with Name\n");
printf ("2 - Search with Code\n");
printf ("Choose:");
scanf ("%d",&choose);
if (choose==1) {printf ("Input Name:");scanf ("%s",input);searchRecord_Name (head,input);}
else if (choose==2) {printf ("Input Code:");scanf ("%s",input);searchRecord_Code (head,input);}
else {printf ("Input Error!");}
break;
case 3:if (head->isEnd)
{
printf (" List is NULL!\n");
}else
{viewAll (head);}
break;
case 4:printf ("Input the code which you want to Delete:");
scanf ("%s",input);
delRecord (head,input);
case 5:setFile (head);break;
case 0:
break;
}
}

//----------------Main
int main ()
{
struct Record *head;

head=getFile ();
while (1)
{setUI (head);}
}

...全文
88 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gx168853 2009-07-01
  • 打赏
  • 举报
回复
哇塞,都是牛人嘿!
大前置 2009-07-01
  • 打赏
  • 举报
回复
struct Record * getFile ()函数中 struct SaveElement *get;
没有分配内存
liao05050075 2009-07-01
  • 打赏
  • 举报
回复

struct Record * getFile ()
{
FILE *f_p;
struct Record *p,*head;
struct SaveElement *get;
head=initRecordList ();

if ((f_p=fopen ("Data.dt","rb"))!=NULL)
{
fread (get,sizeof (struct SaveElement),1,f_p); //pass the sign Elemnt
printf ("pt");
while (1)
{
if (get->isEnd)
{
break;
}
printf ("!");
fread (get,sizeof (struct SaveElement),1,f_p);
p=getRecordCopy (get);
printf ("get->code:%s\n",get->code);
printf ("p->code:%s\n",p->code);
setLocation (head,p);
}
printf ("Read File successful!\n");
(1)****
}
printf ("head->code:%s",head->code);
fclose (f_p);-->问题出在这里,当你没有打开文件的时候,你就不能关闭它。把它移动到(1)****那里就行了
return head;
}
aliershian 2009-07-01
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <malloc.h>

struct Record { //record
char code[15];
char name[10];
char dep[10];
int mark;
int isEnd;
struct Record *pre;
struct Record *next;
};
struct SaveElement {
char code[15];
char name[10];
char dep[10];
int mark;
int isEnd;
};

//----------Build Record List
void setRewrite (struct Record *,char *);
struct Record *initRecordList ()
{
struct Record *p;
p=(struct Record *)malloc (sizeof (struct Record));
strcpy (p->code,"00000000000");
p->isEnd=1;
return p;
}

void setLocation (struct Record *head,struct Record *elemt)
{
struct Record *tmp,*p;
int chs;
int sign=0;
p=head; //The Head of List
while (1)
{
printf ("*");
if (!strcmp ((p->code),(elemt->code))) //
{
printf ("This Record is Alrealy here!\nSo do you want to rewrite it? (1/0):");
scanf ("%d",&chs);
if (chs)
{
setRewrite (head,elemt->code);
}
sign=1;
break;
}
if ((strcmp ((p->code),(elemt->code)))>0) //p>e
{
printf ("^\n");
tmp=p->pre;
printf ("tmp->code:%s",tmp->code);
tmp->next=elemt;
elemt->pre=tmp;
elemt->next=p;
p->pre=elemt;
elemt->isEnd=0;
sign=1;
printf ("Record Added!\n");
break;
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
p->next=elemt;
elemt->pre=p;
p->isEnd=0;
elemt->isEnd=1;
printf ("elemt->code=%s",elemt->code);
printf ("Record Added!\n");
}
}

void addNewRecord (struct Record *head)
{
struct Record *p;
p=(struct Record *)malloc (sizeof (struct Record));

printf ("Input Student's Depertment:");
scanf ("%s",p->dep);
printf ("\nInput Student's Code:");
scanf ("%s",p->code);
printf ("\nInput Student's Name:");
scanf ("%s",p->name);
printf ("\nInput Student's mark:");
scanf ("%d",&p->mark);
setLocation (head,p);

}

struct SaveElement * setRecordCopy (struct Record *elemt)
{
struct SaveElement *element;
element=(struct SaveElement *)malloc (sizeof (struct SaveElement));
strcpy ((element->code),(elemt->code));
strcpy ((element->name),(elemt->name));
strcpy ((element->dep),(elemt->dep));
element->mark=elemt->mark;
element->isEnd=elemt->isEnd;
return element;
}

struct Record * getRecordCopy (struct SaveElement * elemt)
{
struct Record *p=(struct Record *)malloc (sizeof (struct Record));
strcpy ((p->code),(elemt->code));
printf ("Inside p->code=%s\n",p->code);
strcpy ((p->name),(elemt->name));
strcpy ((p->dep),(elemt->dep));
p->mark=elemt->mark;
p->isEnd=elemt->isEnd;
return p;
}

//------------Function

void searchRecord_Code (struct Record *head,char *code)
{
int sign;
struct Record *p;
sign=0;
p=head;
while (1)
{
if (!strcmp (p->code,code))
{
printf ("Got it!\n");
printf ("Code:%s\n",p->code);
printf ("Name:%s\n",p->name);
printf ("Mark:%d\n",p->mark);
sign=1;
break;
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
printf ("Sorry,I can't find the record!\n");
}
}

void searchRecord_Name (struct Record *head,char *name)
{
int sign;
struct Record *p;
sign=0;
p=head;
while (1)
{
if (!strcmp (p->name,name))
{
printf ("Got it!\n");
printf ("Code:%s\n",p->code);
printf ("Name:%s\n",p->name);
printf ("Mark:%d\n",p->mark);
sign=1;
break;
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
printf ("Sorry,I can't find the record!\n");
}
}

void setRewrite (struct Record *head,char *code)
{
int sign;
struct Record *p;
sign=0;
p=head;
while (1)
{
if (!strcmp (p->code,code))
{
printf ("Code:%s\n",p->code);
printf ("Name:%s\n",p->name);
printf ("Input new mark:");
scanf ("%d",&p->mark);
printf ("Ok!");
sign=1;
break;
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
printf ("Sorry,I can't find the record which you want!\n");
}
}

void viewAll (struct Record *head)
{
struct Record *p;
p=head->next;
printf ("\nDepartment Code Name Mark\n");
printf ("===============================================================\n");
while (1)
{
printf ("%s",p->dep);
printf (" %s",p->code);
printf (" %s",p->name);
printf (" %d\n",p->mark);
if (p->isEnd)
{
break;
}
p=p->next;
}
printf ("===============================================================\n");
}

void delRecord (struct Record *head,char *code)
{
int sign;
struct Record *p,*tmp;
sign=0;
p=head;
while (1)
{
if (!strcmp (p->code,code)&&!(p->isEnd))
{
tmp=p->pre;
p->pre->next=p->next;
free (p);
sign=1;
printf ("Delete successful!\n");
break;
}
if (!strcmp (p->code,code)&&(p->isEnd))
{
p->pre->isEnd=1;
free (p);
sign=1;
printf ("Delete successful!\n");
}
if (p->isEnd)
{
break;
}
p=p->next;
}
if (!sign)
{
printf ("Sorry,I can't find the record which you want!\n");
}
}

//----------------File
void setFile (struct Record *head)
{
FILE *f_p;
struct Record *p=head;
struct SaveElement *tmp;
f_p=fopen ("Data.dt","wb");
while (1)
{
tmp=setRecordCopy (p);
fwrite (tmp,sizeof (struct SaveElement),1,f_p);
if (p->isEnd)
{
break;
}
p=p->next;
}
printf ("\nSave finished!");
fclose (f_p);
}

struct Record * getFile ()
{
FILE *f_p;
struct Record *p,*head;
struct SaveElement *get;
head=initRecordList ();

if ((f_p=fopen ("Data.dt","rb"))!=NULL)
{
fread (get,sizeof (struct SaveElement),1,f_p); //pass the sign Elemnt
printf ("pt");
while (1)
{
if (get->isEnd)
{
break;
}
printf ("!");
fread (get,sizeof (struct SaveElement),1,f_p);
p=getRecordCopy (get);
printf ("get->code:%s\n",get->code);
printf ("p->code:%s\n",p->code);
setLocation (head,p);
}
printf ("Read File successful!\n");
}
printf ("head->code:%s",head->code);
fclose (f_p);
return head;
}

//----------------UI
void setUI (struct Record *head)
{
int choose;
int ch;
char input[15];
printf (" Student mark manage System \n");
printf (" Ver 1.0 \n");
printf (" ===========================================================\n");
printf (" 1 Add Record \n");
printf (" 2 Search Record \n");
printf (" 3 Scan All Record \n");
printf (" 4 Delete Record \n");
printf (" 5 Save RecordList \n");
printf (" 6 About \n");
printf (" 0 Quit \n");
printf (" ===========================================================\n");
printf (" Choose:");
scanf ("%d",&choose);
switch (choose)
{
case 1:
while (1)
{
addNewRecord (head);
printf ("\nContinue? (1/0):");
scanf ("%d",&ch);
if (!ch)
{
break;
}
}
break;
case 2:printf ("1 - Search with Name\n");
printf ("2 - Search with Code\n");
printf ("Choose:");
scanf ("%d",&choose);
if (choose==1) {printf ("Input Name:");scanf ("%s",input);searchRecord_Name (head,input);}
else if (choose==2) {printf ("Input Code:");scanf ("%s",input);searchRecord_Code (head,input);}
else {printf ("Input Error!");}
break;
case 3:if (head->isEnd)
{
printf (" List is NULL!\n");
}else
{viewAll (head);}
break;
case 4:printf ("Input the code which you want to Delete:");
scanf ("%s",input);
delRecord (head,input);
case 5:setFile (head);break;
case 0:
break;
}
}

//----------------Main
int main ()
{
struct Record *head;

head=getFile ();
while (1)
{setUI (head);}
}

aliershian 2009-07-01
  • 打赏
  • 举报
回复
额……忙里老出错,请吧getFile那个函数里的返回的注释删了……
aliershian 2009-07-01
  • 打赏
  • 举报
回复
加了,无效,还是出错。
AlwaysSLH 2009-07-01
  • 打赏
  • 举报
回复
加头文件:
#include<string.h>

error C4716: 'getFile' : must return a value
warning C4700: uninitialized local variable 'get' used
aliershian 2009-07-01
  • 打赏
  • 举报
回复
抱歉,一时匆忙,忘了把调试的改过来,最后的main应该是这样的,

int main ()
{
struct Record *head;

head=getFile ();
while (1)
{setUI (head);}
}

69,336

社区成员

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

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