一个C++程序的运行问题

dotamaintain 2010-01-10 04:35:03
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
struct stu
{ int num;
char name;
float score;
struct stu *next;
};

struct stu *Delete(struct stu *tou, int n)
{
struct stu *p1, *p2;
p1=tou;
if(p1->num==n)
tou=p1->next;
else
{
do
{
p2=p1;
p1=p1->next;
}
while(p1!=NULL && p1->num!=n);
if(p1->num==n)
p2->next=p1->next;
else printf("Not be found!\n");
}
free(p1);
return(tou);
}

struct stu *Insert(struct stu *tou, struct stu *s)
{
struct stu *p1, *p2;
p2=p1=tou;
if (tou==NULL)
{tou=s;s->next=NULL;}
else if(s->num<p1->num)
{
s->next=tou;
tou=s;
}
else if(s->num>p1->num)
{
while(s->num>p1->num&&p1->next!=NULL)
{
p2=p1; p1=p1->next;
}
if(s->num<p1->num)
{
p2->next=s; s->next=p1;
}
else if(s->num>p1->num)
{
p1->next=s;
s->next=NULL;
}
}
return(tou);
}

struct stu *Insert2(struct stu *tou, struct stu *s)
{
struct stu *p1, *p2;
p2=p1=tou;
if (tou==NULL)
{tou=s;}
else if(s->score<=p1->score)
{
s->next=tou;
tou=s;
}
else if(s->score>p1->score)
{
while(s->score>p1->score&&p1->next!=NULL)
{
p2=p1; p1=p1->next;
}
if(s->score<=p1->score)
{
p2->next=s; s->next=p1;
}
else if(s->score>p1->score)
{
p1->next=s;
s->next=NULL;
}
}
return(tou);
}

void sequence(struct stu *tou)
{
struct stu *p1, *p2;
p1=tou;
while(p1!=NULL)
{
p2=Insert2(p2,p1);
p1=p1->next;
}
while(p2!=NULL)
{
printf("%ld %10s %d",p2->num,p2->name,p2->score);
p2=p2->next;
}
}

void filewrite(struct stu *tou,FILE *fp)
{
struct stu *p1;
p1=tou;
while(p1!=NULL)
{
fprintf(fp,"%d %s %f",p1->num,p1->name,p1->score);
printf("Number Name score");
printf("%6ld %s %f",p1->num,p1->name,p1->score);
p1=p1->next;
}
}

void main()
{
FILE *fp;
int len;
char i;
int flag=1;
struct stu *tou;
tou=NULL;
len=sizeof(struct stu);
if((fp=fopen("E:\\123.txt","wt+"))==NULL)
{
printf("\n error on open E:\\123.txt file! \n");
exit(1);
}
fp=fopen("E:\\123.txt", "wt+");
printf("1 for read. 2 for insert. 3 for delete. 4 for sequence. 5 for write.\nPlease Choose One:");
while(flag==1)
{
scanf("%c",&i);
switch(i)
{
case '1':
struct stu *temp,*t1;
while(!feof(fp))
{
temp=(struct stu *) malloc(len);
fscanf(fp,"%ld %s %f",&temp->num,temp->name,&temp->score);
tou=Insert(tou,temp);
}
t1=tou;
do
{
printf("Number Name score");
printf("%6ld %s %f\n",t1->num,t1->name,t1->score);
t1=t1->next;
}
while(t1!=NULL);
break;
case '2':
struct stu *s,*t2;
s=(struct stu *) malloc(len);
printf("the num");
scanf("%ld",&s->num);
printf("the name");
scanf("%s",s->name);
printf("the score");
scanf("%f",&s->score);
tou=Insert(tou,s);
t2=tou;
while(t2!=NULL)
{
printf("Number Name score");
printf("%6ld %s %f",t2->num,t2->name,t2->score);
t2=t2->next;
}
break;
case '3':
struct stu *t3;
long k;
printf("tne num to delete");
scanf("%d",&k);
tou=Delete(tou,k);
t3=tou;
while(t3!=NULL)
{
printf("Number Name score");
printf("%6ld %s %f",t3->num,t3->name,t3->score);
t3=t3->next;
}
break;
case '4':
sequence(tou);
break;
case '5':
filewrite(tou,fp);
break;
int t;
printf("Quit or not \n 1 for Yes. 2 for No");
scanf("%d",&t);
if(t==1)
flag=0;
else if(t==2)
flag=1;
else
printf("error");
flag=1;
}
}
fclose(fp);
}

此程序完成的是对指针的插入删除排序等问题 但是运行程序读取的时候就发生问题 具体是什么情况?
...全文
227 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypb362148418 2010-01-12
  • 打赏
  • 举报
回复
好长啊,下次说出来哪错了,大家也好改啊,这样直接上一堆代码,真的好长
cocat 2010-01-12
  • 打赏
  • 举报
回复
好多啊~看不下去~楼主还是把核心代码贴出来吧
macrojj 2010-01-12
  • 打赏
  • 举报
回复
你的指针非法访问了
xczjm 2010-01-12
  • 打赏
  • 举报
回复
好长啊,LZ
elegant87 2010-01-12
  • 打赏
  • 举报
回复

//把你的main函数改了改
void main()
{
FILE *fp;
int len,t;
int i;
int flag=1;
struct stu *tou=NULL;
len=sizeof(struct stu);
if((fp=fopen("E:\\123.txt","wt+"))==NULL)
{
printf("\n error on open E:\\123.txt file! \n");
exit(1);
}
fp=fopen("E:\\123.txt", "wt+");

while(flag==1)
{
printf("1 for read. 2 for insert. 3 for delete. 4 for sequence. 5 for write.\nPlease Choose One:");
scanf("%d",&i);
switch(i)
{
case 1:
{
struct stu *temp,*t1;
while(!feof(fp))
{
temp=(struct stu *) malloc(len);
fscanf(fp,"%ld %s %f",&temp->num,temp->name,&temp->score);
tou=Insert(tou,temp);
}
t1=tou;
do
{
printf("Number Name score");
printf("%6ld %s %f\n",t1->num,t1->name,t1->score);
t1=t1->next;
} while(t1!=NULL);
}
break;
case 2:
{
struct stu *s,*t2;
s=(struct stu *) malloc(len);
printf("the num");
scanf("%ld",&s->num);
printf("the name");
scanf("%s",s->name);
printf("the score");
scanf("%f",&s->score);
tou=Insert(tou,s);
t2=tou;
while(t2!=NULL)
{
printf("Number Name score");
printf("%6ld %s %f",t2->num,t2->name,t2->score);
t2=t2->next;
}
}
break;
case 3:
{
struct stu *t3;
long k;
printf("tne num to delete");
scanf("%d",&k);
tou=Delete(tou,k);
t3=tou;
while(t3!=NULL)
{
printf("Number Name score");
printf("%d %s %f",t3->num,t3->name,t3->score);
t3=t3->next;
}
}
break;
case 4:
sequence(tou);
break;
case 5:
filewrite(tou,fp);
break;
}
printf("\nQuit or not \n 1 for Yes. 2 for No");
scanf("%d",&t);
if(t==1)
flag=0;
else
if(t==2)
flag=1;
else
{
printf("error\n");
flag=1;
}
}
fclose(fp);
}
logiciel 2010-01-11
  • 打赏
  • 举报
回复
再帮你改一些:

结构类型stu中的name应是一个数组。
printf一行要有回车。
处理“Quit or not”的地方有问题。

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

#define MAX_NAME 30 //新加
struct stu
{
int num;
char name[MAX_NAME]; //新加
float score;
struct stu *next;
};

struct stu *Delete(struct stu *tou, int n)
{
struct stu *p1, *p2;
p1=tou;
if(p1->num==n)
tou=p1->next;
else
{
do
{
p2=p1;
p1=p1->next;
}
while(p1!=NULL && p1->num!=n);
if(p1->num==n)
p2->next=p1->next;
else printf("Not be found!\n");
}
free(p1);
return(tou);
}

struct stu *Insert(struct stu *tou, struct stu *s)
{
struct stu *p1, *p2;
p2=p1=tou;
if (tou==NULL)
{tou=s;s->next=NULL;}
else if(s->num <p1->num)
{
s->next=tou;
tou=s;
}
else if(s->num>p1->num)
{
while(s->num>p1->num&&p1->next!=NULL)
{
p2=p1; p1=p1->next;
}
if(s->num <p1->num)
{
p2->next=s; s->next=p1;
}
else if(s->num>p1->num)
{
p1->next=s;
s->next=NULL;
}
}
return(tou);
}

struct stu *Insert2(struct stu *tou, struct stu *s)
{
struct stu *p1, *p2;
p2=p1=tou;
if (tou==NULL)
{tou=s;}
else if(s->score <=p1->score)
{
s->next=tou;
tou=s;
}
else if(s->score>p1->score)
{
while(s->score>p1->score&&p1->next!=NULL)
{
p2=p1; p1=p1->next;
}
if(s->score <=p1->score)
{
p2->next=s; s->next=p1;
}
else if(s->score>p1->score)
{
p1->next=s;
s->next=NULL;
}
}
return(tou);
}

void sequence(struct stu *tou)
{
struct stu *p1, *p2;
p1=tou;
while(p1!=NULL)
{
p2=Insert2(p2,p1);
p1=p1->next;
}
while(p2!=NULL)
{
printf("%ld %10s %d\n",p2->num,p2->name,p2->score); //printf("%ld %10s %d",p2->num,p2->name,p2->score);
p2=p2->next;
}
}

void filewrite(struct stu *tou,FILE *fp)
{
struct stu *p1;
p1=tou;
while(p1!=NULL)
{
fprintf(fp,"%d %s %f\n",p1->num,p1->name,p1->score); //fprintf(fp,"%d %s %f",p1->num,p1->name,p1->score);
printf("Number Name score\n"); //printf("Number Name score");
printf("%6ld %s %f\n",p1->num,p1->name,p1->score); //printf("%6ld %s %f",p1->num,p1->name,p1->score);
p1=p1->next;
}
}

void main()
{
FILE *fp;
int len;
char i;
int flag=1;
struct stu *tou=NULL;
len=sizeof(struct stu);
if((fp=fopen("E:\\123.txt","wt+"))==NULL)
{
printf("\n error on open E:\\123.txt file! \n");
exit(1);
}
fp=fopen("E:\\123.txt", "wt+");
while(flag==1)
{
//移到这里,每次有提示
printf("1 for read. 2 for insert. 3 for delete. 4 for sequence. 5 for write.\nPlease Choose One:");
scanf("%c",&i);
switch(i)
{
case '1':
struct stu temp, *t1;
while (fscanf(fp,"%ld %s %f",&temp.num,temp.name,&temp.score)==3)
{
struct stu *temp2=(struct stu *) malloc(len);
*temp2 = temp;
tou=Insert(tou,temp2);
}
t1=tou;
while(t1!=NULL)
{
printf("Number Name score\n"); //printf("Number Name score");
printf("%6ld %s %f\n",t1->num,t1->name,t1->score); //printf("%6ld %s %f\n",t1->num,t1->name,t1->score);
t1=t1->next;
}
break;
case '2':
struct stu *s,*t2;
s=(struct stu *) malloc(len);
printf("the num");
scanf("%ld",&s->num);
printf("the name");
scanf("%s",s->name);
printf("the score");
scanf("%f",&s->score);
tou=Insert(tou,s);
t2=tou;
while(t2!=NULL)
{
printf("Number Name score\n"); //printf("Number Name score");
printf("%6ld %s %f\n",t2->num,t2->name,t2->score); //printf("%6ld %s %f",t2->num,t2->name,t2->score);
t2=t2->next;
}
break;
case '3':
struct stu *t3;
long k;
printf("tne num to delete");
scanf("%d",&k);
tou=Delete(tou,k);
t3=tou;
while(t3!=NULL)
{
printf("Number Name score\n");//printf("Number Name score");
printf("%6ld %s %f\n",t3->num,t3->name,t3->score); //printf("%6ld %s %f",t3->num,t3->name,t3->score);
t3=t3->next;
}
break;
case '4':
sequence(tou);
break;
case '5':
filewrite(tou,fp);
break;
} //新加
int t;
printf("Quit or not \n 1 for Yes. 2 for No");
scanf("%d",&t);
if(t==1)
flag=0;
else if(t==2)
flag=1;
else
{//新加
printf("error");
flag=1;
}//新加
fflush(stdin);//新加
}
fclose(fp);
}
ysuliu 2010-01-11
  • 打赏
  • 举报
回复
好长啊,帮顶。。
麻烦下次说出问题在哪,免得从头看。。。
IT_lau 2010-01-11
  • 打赏
  • 举报
回复
xx
logiciel 2010-01-10
  • 打赏
  • 举报
回复
帮你改一段:

case '1': 
struct stu *t1;
while(!feof(fp))
{
struct stu temp;
if (fscanf(fp,"%ld %s %f",&temp.num,temp.name,&temp.score)==3)
{
struct stu *temp2=(struct stu *) malloc(len);
*temp2 = temp;
tou=Insert(tou,temp2);
}
}
t1=tou;
while(t1!=NULL)
{
printf("Number Name score");
printf("%6ld %s %f\n",t1->num,t1->name,t1->score);
t1=t1->next;
}
break;

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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