读书人

调试后好像是地址冲突 但不知怎么解决

发布时间: 2012-05-07 12:40:40 作者: rapoo

调试后好像是地址冲突 但不知如何解决 求解答
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define bool int
#define true 1
#define false 0
#define LEN sizeof(struct Member)
struct Member
{
char name[20];
int score;
char *degree;
struct Member *next;
};
typedef struct Member member;
member *head=NULL;
void ShowMenu();//打印功能选择菜单
void Find();//查找单个记录并输出
void Display();//输出全部记录
void AddData();//添加记录
void ModifyActive();//修改全部同学的活力点
void SaveAndFree();//输出信息到文件并保存,并释放链表空间
void Open();//文件信息输出到链表
member *FindData();
int main(void)
{
char x;
bool quit=false;//创建并设置退出循环的条件为假
Open();//文件信息输出到链表
while(!quit)//程序循环
{
ShowMenu();//显示菜单
scanf("%s",&x);//选择
switch(x)
{
case '0':quit=true;SaveAndFree();break;//退出循环条件为真,退出并保存信息
case '1':AddData();break;//添加数据
case '2':ModifyActive();break;//修改数据
case '3':Find();break;//查找数据并显示
case '4':Display();break;//显示所有数据
defalut:break;

}
}
return 0;
}
void ShowMenu()//打印功能选择菜单
{
printf("\n *******************************\n");
printf(" 0.退出\n");
printf(" 1.添加记录");
printf(" 2.修改活力点\n");
printf(" 3.查找记录");
printf(" 4.显示全部数据");
printf("\n *******************************\n");
printf("请选择:");
}
void SaveAndFree()//输出信息到文件,并释放链表空间
{
member *p=NULL;
FILE *fp;
if(NULL==head)
{
printf("\n记录已空\n");
}
else
{
p=head->next;
}
if((fp=fopen("E:\\data.dat","w"))==NULL)//出错检测
printf("无法打开文件!\n");
while(p!=NULL)
{
fprintf(fp,"%s\t %d\t %s\t\n",p->name,p->score,p->degree);
p=p->next;
}
printf("保存完毕!\n");
fclose(fp);

//释放链表空间
for(;head->next!=NULL;)//删除除头指针以外的所有申请空间
{
head->next=head->next->next;
free(head);

}
free(head);//释放头指针所占的空间
}
void Open()//文件信息输出到链表
{
FILE *fp;
member *p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("E:\\data.dat","r"))==NULL)//文件不存在,表明第一次使用本程序
printf("没有文件!\n");
printf(" 通信学院活力点管理系统 ");
head=(member*)malloc(sizeof(member));
head->next=NULL;
temp=p2=head;
while(!feof(fp))//循环读取文件数据
{
p1=(member*)malloc(LEN);
temp=p2;
p2->next=p1;
p2=p1;
fscanf(fp,"%s%d%s",p1->name,p1->score,p1->degree);
}
temp->next=NULL;
fclose(fp);
}
member *FindData()
{
char name[20];
member *p=NULL;
printf("请输入姓名:\n");
scanf("%s",name);
if(head==NULL)
{
printf("对不起,活力点系统中没有这项纪录!\n");
return NULL;
}
for(p=head;p->next!=NULL;p=p->next)
{

if(!strcmp(p->next->name,name))
return p;
}
return NULL;

}
void Find()//输出单个数据
{
member *p=FindData();
if(NULL==p)
{
printf("对不起,没有找到该项纪录!");
}
else
{
printf("找到该同学:\n姓名: %s 活力点: %d 等级: %s \n",p->next->name,p->next->score,p->next->degree);
}
}
void Display()//输出全部数据
{
member *p=NULL;
if(head==NULL)
{
printf("系统中没有记录,请输入记录后,再使用本功能!\n");
}
for(p=head->next;p!=NULL;p=p->next)
printf("姓名: %s 活力点: %d 等级: %s\n",p->name,p->score,p->degree);

}
void ModifyActive()//修改全部同学的活力点
{
member *p=NULL;


int active;
for(p=head->next;p!=NULL;p=p->next)
{
printf("需要修改的记录:\n姓名: %s 活力点: %d 等级: %s ",p->name,p->score,p->degree);
printf("活力点(正整数):");
scanf("%d",&active);
p->score+=active;
if ( p->score < 3)
p->degree="种子";
else if( p->score<8)
p->degree="树苗";
else if ( p->score<16)
p->degree="小树";
else if( p->score<29)
p->degree="大树";
else if( p->score<40)
p->degree="参天大树";
else
p->degree="栋梁";
}
}
void AddData()//系统中添加数据
{
member *p1=NULL,*p2=NULL;
p1=(member *)malloc(sizeof(member));//预先开辟一块内存空间
p1->degree="树苗";
p1->score=0;
printf("输入姓名:\n");
scanf("%s",p1->name);
p1->next=NULL;
if(NULL==head)
{
head=(member*)malloc(sizeof(member));
head->next=p1;
}
else
{
for(p2=head;p2->next!=NULL;p2=p2->next);
p2->next=p1;
}

}










[解决办法]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define bool int
#define true 1
#define false 0
#define LEN sizeof(struct Member)
struct Member
{
char name[20];
int score;
char degree[200];
struct Member *next;
};
typedef struct Member member;
member *head=NULL;
void ShowMenu();//打印功能选择菜单
void Find();//查找单个记录并输出
void Display();//输出全部记录
void AddData();//添加记录
void ModifyActive();//修改全部同学的活力点
void SaveAndFree();//输出信息到文件并保存,并释放链表空间
void Open();//文件信息输出到链表
member *FindData();
int main(void)
{
char x;
bool quit=false;//创建并设置退出循环的条件为假
Open();//文件信息输出到链表
while(!quit)//程序循环
{
ShowMenu();//显示菜单
scanf("%s",&x);//选择
switch(x)
{
case '0':quit=true;SaveAndFree();break;//退出循环条件为真,退出并保存信息
case '1':AddData();break;//添加数据
case '2':ModifyActive();break;//修改数据
case '3':Find();break;//查找数据并显示
case '4':Display();break;//显示所有数据
defalut:break;

}
}
return 0;
}
void ShowMenu()//打印功能选择菜单
{
printf("\n *******************************\n");
printf(" 0.退出\n");
printf(" 1.添加记录");
printf(" 2.修改活力点\n");
printf(" 3.查找记录");
printf(" 4.显示全部数据");
printf("\n *******************************\n");
printf("请选择:");
}

void SaveAndFree()//输出信息到文件,并释放链表空间
{
member *p=NULL;
FILE *fp;
if(NULL==head)
{
printf("\n记录已空\n");
}
else
{
p=head->next;
}
if((fp=fopen("E:\\data.dat","w"))==NULL)//出错检测
printf("无法打开文件!\n");
while(p!=NULL)
{
fprintf(fp,"%s\t %d\t %s\t\n",p->name,p->score,p->degree);
p=p->next;
}
printf("保存完毕!\n");
fclose(fp);

//释放链表空间
for(;head->next!=NULL;)//删除除头指针以外的所有申请空间
{
head->next=head->next->next;
free(head);

}
free(head);//释放头指针所占的空间
}
void Open()//文件信息输出到链表
{
FILE *fp;
member *p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("E:\\data.dat","r"))==NULL)//文件不存在,表明第一次使用本程序
{
printf("没有文件!\n");
return;
}

printf(" 通信学院活力点管理系统 ");


head=(member*)malloc(sizeof(member));
head->next=NULL;
temp=p2=head;
while(!feof(fp))//循环读取文件数据
{
p1=(member*)malloc(LEN);
temp=p2;
p2->next=p1;
p2=p1;
fscanf(fp,"%s%d%s",p1->name,&p1->score,p1->degree);
}
temp->next=NULL;
fclose(fp);
}
member *FindData()
{
char name[20];
member *p=NULL;
printf("请输入姓名:\n");
scanf("%s",name);
if(head==NULL)
{
printf("对不起,活力点系统中没有这项纪录!\n");
return NULL;
}
for(p=head;p->next!=NULL;p=p->next)
{

if(!strcmp(p->next->name,name))
return p;
}
return NULL;

}
void Find()//输出单个数据
{
member *p=FindData();
if(NULL==p)
{
printf("对不起,没有找到该项纪录!");
}
else
{
printf("找到该同学:\n姓名: %s 活力点: %d 等级: %s \n",p->next->name,p->next->score,p->next->degree);
}
}
void Display()//输出全部数据
{
member *p=NULL;
if(head==NULL)
{
printf("系统中没有记录,请输入记录后,再使用本功能!\n");
}
for(p=head->next;p!=NULL;p=p->next)
printf("姓名: %s 活力点: %d 等级: %s\n",p->name,p->score,p->degree);

}
void ModifyActive()//修改全部同学的活力点
{
member *p=NULL;
int active;
for(p=head->next;p!=NULL;p=p->next)
{
printf("需要修改的记录:\n姓名: %s 活力点: %d 等级: %s ",p->name,p->score,p->degree);
printf("活力点(正整数):");
scanf("%d",&active);
p->score+=active;
if ( p->score < 3)
_snprintf(p->degree,sizeof(p->degree),"种子");
else if( p->score<8)
_snprintf(p->degree,sizeof(p->degree),"树苗");
else if ( p->score<16)
_snprintf(p->degree,sizeof(p->degree),"小树");
else if( p->score<29)
_snprintf(p->degree,sizeof(p->degree),"大树");
else if( p->score<40)
_snprintf(p->degree,sizeof(p->degree),"参天大树");
else
_snprintf(p->degree,sizeof(p->degree),"栋梁");
}
}
void AddData()//系统中添加数据
{
member *p1=NULL,*p2=NULL;
p1=(member *)malloc(sizeof(member));//预先开辟一块内存空间
_snprintf(p1->degree,sizeof(p1->degree),"树苗");
p1->score=0;
printf("输入姓名:\n");
scanf("%s",p1->name);
p1->next=NULL;
if(NULL==head)
{
head=(member*)malloc(sizeof(member));
head->next=p1;
}
else
{
for(p2=head;p2->next!=NULL;p2=p2->next);
p2->next=p1;
}

}

上面是修正后的代码,插入,修改,查询都没问题,只是最后0选项退出保存文件的时候:
//释放链表空间
for(;head->next!=NULL;)//删除除头指针以外的所有申请空间
{
head->next=head->next->next;
free(head);

}
free(head);//释放头指针所占的空间

是错的,如果是单向链表记得使用递归聪后向前删除每个节点。

读书人网 >C语言

热点推荐