首页 > 用户发贴区 > 编程问题提问区 > ACCESS VIOLATION问题
2007
11-19

麻烦大家帮我看一下,为什么我的函数在排序函数时出错,经调试是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);//释放线性表的空间
 
 
}


ACCESS VIOLATION问题》有 1 条评论

  1. coolker 说:

     while((*Pointer1).Math>(*Pointer2).Math&&Pointer2!=NULL)

    会出错是因为Pointer2!=NULL这个条件不应该在使用以后再判断,必须在使用Pointer2以前判断,只要将所有的排序函数的里的这段代码改成

     while(Pointer2!=NULL&&(*Pointer1).Math>(*Pointer2).Math)

    这样就可以了..至于结果不正确.就要分析一下代码了.

留下一个回复