麻烦大家帮我看一下,为什么我的函数在排序函数时出错,经调试是ACCESS VIOLATION我把函数标出,请大家帮帮忙。
//本程序的主要功能是编写一个学生成绩系统。(具有查询成绩、删除成绩、添加成绩、求全班平均的作用)
#include <stdlib.h>
#include <stdio.h>
#define MAX 10
int TableTotal;
typedef struct List
{
int Number;
int Chinese;
int English;
int Math;
char Name[MAX];
struct List *Next;
}Node, *Link ;
void Print_List(Link Head);
Link Order_List_Chinese(Link Head)//排序函数1
{
Link Pointer1,Pointer2,Pointer3,Pointer4;
Pointer1=Head;
Pointer2=(Link)malloc(sizeof(Node));
Head=Pointer2;
(*Pointer2).Math=0;
(*Pointer2).English=0;
(*Pointer2).Chinese=0;
(*Pointer2).Next=NULL;
do
{
while((*Pointer1).Chinese>(*Pointer2).Chinese&&Pointer2!=NULL)
{
Pointer3=Pointer2;
Pointer2=(*Pointer2).Next;
}
(*Pointer3).Next=Pointer1;
Pointer4=Pointer1;
(*Pointer1).Next=Pointer2;
Pointer1=(*Pointer4).Next;
}while(Pointer1!=NULL);
return(Head);
}
Link Order_List_English(Link Head)//排序函数2
{
Link Pointer1,Pointer2,Pointer3,Pointer4;
Pointer1=Head;
Pointer2=(Link)malloc(sizeof(Node));
Head=Pointer2;
(*Pointer2).Math=0;
(*Pointer2).English=0;
(*Pointer2).Chinese=0;
(*Pointer2).Next=NULL;
do
{
while((*Pointer1).English>(*Pointer2).English&&Pointer2!=NULL)
{
Pointer3=Pointer2;
Pointer2=(*Pointer2).Next;
}
(*Pointer3).Next=Pointer1;
Pointer4=Pointer1;
(*Pointer1).Next=Pointer2;
Pointer1=(*Pointer4).Next;
}while(Pointer1!=NULL);
return(Head);
}
Link Order_List_Math(Link Head)//排序函数3
{
Link Pointer1,Pointer2,Pointer3,Pointer4;
Pointer1=Head;
Pointer2=(Link)malloc(sizeof(Node));
Head=Pointer2;
(*Pointer2).Math=0;
(*Pointer2).English=0;
(*Pointer2).Chinese=0;
(*Pointer2).Next=NULL;
do
{
while((*Pointer1).Math>(*Pointer2).Math&&Pointer2!=NULL)
{
Pointer3=Pointer2;
Pointer2=(*Pointer2).Next;
}
(*Pointer3).Next=Pointer1;
Pointer4=Pointer1;
(*Pointer1).Next=Pointer2;
Pointer1=(*Pointer4).Next;
}while(Pointer1!=NULL);
return(Head);
}
Link Order_List(Link Head)
{
int Index;
fflush(stdin);
printf(“如果您要按语文成绩排序请输入1:\n”);
printf(“如果您要按英语成绩排序请输入2:\n”);
printf(“如果您要按数学成绩排序请输入3:\n”);
scanf(“%d”,&Index);
switch(Index)
{
case 1:Head=Order_List_Chinese( Head);break;
case 2:Head=Order_List_English( Head);break;
case 3:Head=Order_List_Math( Head);break;
}
return(Head);
}
Link Insert_List(Link Head,Link New,int Key)
{
Link Pointer;
Pointer=Head;
while(1)
{
if (Pointer==NULL)
{
(*New).Next=Head;
Head=New;
break;
}
if((*Pointer).Number==Key)
{
(*New).Next=(*Pointer).Next;
(*Pointer).Next=New;
break;
}
Pointer=(*Pointer).Next;
}
return Head;
}
Link List_Insert(Link Head)
{
Link New;
int Key;//用来输入要查找数据的序号
if(Head!=NULL)
{ while(1)//这个函数的作用是在线性表中插入一个数据,如果找不到插入位置(如线性表一共只有6个元素,你却输入要插在第7个元素的后面,则会把这个元素插入在表头的位置。
{ New=(Link)malloc(sizeof(Node));
printf(“请输入你要数据要插入数据位置的序号:(请输入一个大于0的整数,输入0退出)\n”);
scanf(“%d”,&Key);
if(Key<0||Key>32767)
continue;
if(Key==0)
break;
printf(“请输入序号:”);
scanf(“%d”,&(*New).Number);
printf(“请输入语文成绩:”);
scanf(“%d”,&(*New).Chinese);
printf(“请输入英语成绩:”);
scanf(“%d”,&(*New).English);
printf(“请输入数学成绩:”);
scanf(“%d”,&(*New).Math);
printf(“请输入姓名:”);
scanf(“%s”,(*New).Name);
Head=Insert_List( Head,New,Key);
Print_List(Head);
}
}
return Head;
}
Link Delete_List(Link Head,int Key)
{
Link Pointer;
Link Back;
Pointer=Head;
while(1)
{
if((*Pointer).Next==NULL)
{
printf(“Not Found!!\n”);
break;
}
if((*Head).Number==Key)
{
Head=(*Pointer).Next;
free(Pointer);
break;
}
Back=Pointer;
Pointer=(*Pointer).Next;
if((*Pointer).Number==Key)
{
(*Back).Next=(*Pointer).Next;
free(Pointer);
break;
}
}
return Head;
}
Link List_Delete(Link Head)
{ int Key;//用来输入要查找数据的序号
if(Head!=NULL)
{
while(1)//主要是进行删除,删除完毕后逐个输出数据元素
{
printf(“请输入你要删除的数据的序号:(请输入一个大于0的整数,输入0退出)\n”);
scanf(“%d”,&Key);
if(Key<0||Key>32767)
continue;
if(Key==0)
break;
Head=Delete_List(Head,Key);
Print_List(Head);
}
}
return Head;}
int List_Search(int Key,Link Head)
{ Link Pointer;
Pointer=Head;
while(Pointer!=NULL)
{
if((*Pointer).Number==Key)
{
printf(“Data Number: %d\n”,(*Pointer).Number);
printf(“Data Chinese: %d\n”,(*Pointer).Chinese);
printf(“Data English: %d\n”,(*Pointer).English);
printf(“Data Math: %d\n”,(*Pointer).Math);
printf(“Name: %s\n”,(*Pointer).Name);
return 1;
}
Pointer=(*Pointer).Next;
}
return 0;
}
void Search_List(Link Head)
{ int Key;//用来输入要查找数据的序号
if(Head!=NULL)
{ while(1)//这个函数的作用是进行查找操作
{
printf(“请输入您要查找的数据的序号:(请输入一个大于0的整数,输入0退出)\n”);
scanf(“%d”,&Key);
if(Key<0||Key>32767)
continue;
if(Key==0)
break;
if(List_Search(Key,Head)==0)
printf(“没有找到\n”);
}
}
}
float Aver_Chinese(Link Head)//求语文的平均分
{
float Sum;
Link Pointer;
int i=0;
Sum=0.0;
Pointer=Head;
while(Pointer!=NULL)
{
Sum+=(*Pointer).Chinese;
i++;
Pointer=(*Pointer).Next;
}
Sum=Sum/i;
return(Sum);
}
float Aver_English(Link Head)//求英语的平均分
{
float Sum=0.0;
Link Pointer;
int i=0;
Sum=0.0;
Pointer=Head;
while(Pointer!=NULL)
{
Sum+=(*Pointer).English;
i++;
Pointer=(*Pointer).Next;
}
Sum=Sum/i;
return(Sum);
}
float Aver_Math(Link Head)//求英语的平均分
{
float Sum=0.0;
Link Pointer;
int i=0;
Sum=0.0;
Pointer=Head;
while(Pointer!=NULL)
{
Sum+=(*Pointer).Math;
i++;
Pointer=(*Pointer).Next;
}
Sum=Sum/i;
return(Sum);
}
void Aver_Score(Link Head)
{
float Aver_1;//用来存储各科的平均分数
float Aver_2;
float Aver_3;
printf(“这个班的语文平均成绩为:\n”);
Aver_1=Aver_Chinese( Head);
printf(“%f\n”,Aver_1);
printf(“这个班的英语平均成绩为:\n”);
Aver_2=Aver_English( Head);
printf(“%f\n”,Aver_2);
printf(“这个班的数学平均成绩为:\n”);
Aver_3=Aver_Math( Head);
printf(“%f\n”,Aver_3);
}
int List_Modify(int Key,Link Head,int Chinese,int English,int Math)
{ Link Pointer;
Pointer=Head;
while(Pointer!=NULL)
{
if((*Pointer).Number==Key)
{
(*Pointer).Chinese=Chinese;
(*Pointer).English=English;
(*Pointer).Math=Math;
return 1;
}
Pointer=(*Pointer).Next;
}
return 0;
}
Link Update_List(Link Head)
{ int Key;//用来输入要查找数据的序号
int index;//用来标示在更新操作中有没有找到需要更新的数据
int Chinese,English,Math;//输入更新后的语文和数学及英语的成绩
if(Head!=NULL)
{ while(1)//对线性表进行更新操作
{
printf(“请输入你要更新的数据的序号:(请输入一个大于0的整数,输入0退出)\n”);
scanf(“%d”,&Key);
if(Key<0||Key>32767)
continue;
if(Key==0)
break;
printf(“请输入更新后的语文成绩:\n”);
scanf(“%d”,&Chinese);
printf(“请输入更新后的英语成绩:\n”);
scanf(“%d”,&English);
printf(“请输入更新后的数学成绩:\n”);
scanf(“%d”,&Math);
index=List_Modify( Key, Head, Chinese, English, Math);
if(index==0)
{
printf(“没有找到您要更新的数据!”);
continue;
}
Print_List( Head);
}
}
return Head;}
void Print_List(Link Head)
{
Link Pointer;
Pointer=Head;
while(Pointer!=NULL)
{
printf(“Data Number: %d\n”,(*Pointer).Number);
printf(“Data Chinese: %d\n”,(*Pointer).Chinese);
printf(“Data English: %d\n”,(*Pointer).English);
printf(“Data Math: %d\n”,(*Pointer).Math);
printf(“Name: %s\n”,(*Pointer).Name);
Pointer=(*Pointer).Next;
}
printf(“\n”);
}
void Free_List(Link Head)
{
Link Pointer;
while(Head!=NULL)
{
Pointer=Head;
Head=(*Head).Next;
free(Pointer);
}
}
Link Create_List()
{ Link Head;
Link New;
Link Pointer;
int i;
Head=(Link)malloc(sizeof(Node));
if(Head==NULL)
printf(“Memory allocate Failure!\n”);
else
{
printf(“请输入序号:”);
scanf(“%d”,&(*Head).Number);
printf(“请输入语文成绩:”);
scanf(“%d”,&(*Head).Chinese);;
printf(“请输入英语成绩:”);
scanf(“%d”,&(*Head).English);
printf(“请输入数学成绩::”);
scanf(“%d”,&(*Head).Math);
printf(“请输入姓名:”);
scanf(“%s”,(*Head).Name);
(*Head).Next=NULL;
Pointer=Head;
for(i=1;i<TableTotal;i++)//在这里设置建立的线性表中包含的数据的个数
{
New=(Link)malloc(sizeof(Node));
printf(“请输入序号:”);
scanf(“%d”,&(*New).Number);
printf(“请输入语文成绩:”);
scanf(“%d”,&(*New).Chinese);
printf(“请输入英语成绩:”);
scanf(“%d”,&(*New).English);
printf(“请输入数学成绩:”);
scanf(“%d”,&(*New).Math);
printf(“清输入姓名:”);
scanf(“%s”,(*New).Name);
(*New).Next=NULL;
(*Pointer).Next=New;
Pointer=New;
}
}
return Head;
}
void main()
{ int Index;
Link Head;
printf(“请输入您要建立的链表的数目:\n”);
scanf(“%d”,&TableTotal);
Head=Create_List();
while(1)
{
printf(“请输入您要执行的操作\n”);
printf(“如果要执行查找操作请输入1\n”);
printf(“如果要执行插入操作请输入2\n”);
printf(“如果要执行删除操作请输入3\n”);
printf(“如果要执行更新操作请输入4\n”);
printf(“如果要执行求全班平均数操作请输入5\n”);
printf(“如果要进行全班排序操作请输入6\n”);
printf(“输入 0 结束操作\n”);
scanf(“%d”,&Index);
if(Index==0) break;
switch (Index)
{case 1: Search_List(Head) ;
break;
case 2: Head=List_Insert(Head);
break;
case 3: Head=List_Delete(Head);
break;
case 4: Head=Update_List(Head);
break;
case 5: Aver_Score(Head);
break;
case 6: Order_List( Head);
break;
default: printf(“小样,想耍我是吧!!找刺激啊你\n”);
}
}
Free_List( Head);//释放线性表的空间
}
>> 本文固定链接: http://www.vcgood.com/archives/1935
>> 转载请注明: jinqiangke 2007年11月19日 于 C语言帝国 发表
while((*Pointer1).Math>(*Pointer2).Math&&Pointer2!=NULL)
会出错是因为Pointer2!=NULL这个条件不应该在使用以后再判断,必须在使用Pointer2以前判断,只要将所有的排序函数的里的这段代码改成
while(Pointer2!=NULL&&(*Pointer1).Math>(*Pointer2).Math)
这样就可以了..至于结果不正确.就要分析一下代码了.