m0_51866352
小白公主&&俞
采纳率100%
2020-12-24 16:47

received signal SIGSEGV, Segmentation fault

已采纳

这里是一只大一的菜狗,要完成老师布置的一个程序,目的是做一个学生信息系统:学生信息包括:学号,姓名,语文、数学和英语课的成绩。其中包括以下子函数:链表创建函数、链表输出函数、链表插入函数和链表删除函数。

#include <iostream>
#include <string.h>
#include <cstring>
#include<cstdlib>
using namespace std;
class student{
	private:
		int num;
		char name[10];
		double score[3];
		student *next;
	public:
		student()
		{cout<<"...."<<endl;}
		student(int num1,char *name1,double *score1)    //拷贝构造函数 
		{   double*p=score1;
			num=num1;
			strcpy(name,name1);
			*p=score[0];
			*(p+1)=score[1];
			*(p+2)=score[2];
			next=NULL;
		}
		
        double aveage()//平均成绩函数 
		{         
			int i;
			double sum;
			for(i=0;i<3;i++){
				sum=sum+score[i];
			}
			return sum/3;
		}
		
		void setnext(student *n)
		{next=n;}
		
		student *getnext()
		{return next;} 
	
	    int getnum()
		{return num;}
		
		char *getname()
		{return name;}
		
		double *getscore()
		{return score;}
	
	
	
	};
		
		
		
		
class studentlist{
	private:
		student *head;
		int sum;
	public:
		studentlist(){
			head=NULL;
			sum=0;
			cout<<"欢迎使用学生信息管理系统"<<endl;
			 
		}
		
		~studentlist(){
			cout<<"感谢使用"<<endl;
		} 
		void show(){
			cout<<"输入学生列表请按1"<<endl;
			cout<<"插入学生信息请按2"<<endl;
			cout<<"删除学生信息请按3"<<endl;
			cout<<"查看学生列表请按4"<<endl;
			cout<<"退出学生系统请按5"<<endl;
			cout<<"查看学生平均成绩请按6"<<endl;
		}
		void print() //输出函数 
		{       
			student *p=head;
			while(p!=NULL){
				cout<<p->getnum()<<" "<<p->getname()<<" "<<p->getscore()<<" "<<p->getscore()+1<<" "<<p->getscore()+2<<" "<<endl;
				p->getnext();
			}
		} 
		void new1()
		{head=new student;}
		
		void creat(){
			int num;
			double score[3];
			char name[10];
			student *p=head;
			cout<<"请输入学号"<<endl;
			cin>>num;
			cout<<"请输入姓名"<<endl;
			cin>>name; 
			cout<<"请输入三门课的成绩"<<endl;
			cin>>score[0]>>score[1]>>score[2];
			student *p1=new student(num,name,score);
			for(int i=0;i<sum;i++)
			{p=p->getnext();}
			 p->setnext(p1);
			 sum++;
		}
			
	    void insert()  //插入函数 
		 {
	        student *p1,*p2,*insert1;
	        int num11;
	        char name11[10];
	        double score11[3];
	        
	        cout<<"请输入学号"<<endl;
			cin>>num11;
			cout<<"请输入姓名"<<endl;
			cin>>name11; 
			cout<<"请输入三门课的成绩"<<endl;
			cin>>score11[0]>>score11[1]>>score11[2];
			insert1=new student(num11,name11,score11);
			
			p2=p1=head;
			if(head==NULL){head=insert1;}                    //可能有点问题。 
			else
			   {while((p1->getnum()<num11)&&(p1->getnext()!=NULL))  //同上 
			      {p2=p1;
			       p1=p1->getnext(); 
			      }
			       if(p1->getnum()>=num11)
			         {if(p1==head)head=insert1;           //同上 
			          else
			            p2->setnext(insert1);
			            insert1->setnext(p1);
			         }
			       else
			         {p2->setnext(insert1);
					 }
			   }
			   sum++;
			   
		 }
		 void del()
		 { int delnum;
		   cout<<"请输入要删除的学生学号"<<endl;
		   cin>>delnum; 
		   student *p1,*p2;
		   p1=p2=head;
		   if(head==NULL){cout<<"查无此项"<<endl;}
		   while((p1->getnum()!=delnum)&&(p1->getnext()!=NULL)) 
		     {p2=p1;
			  p1=p1->getnext();
			 } 
		   if(p1->getnum()==delnum)
		     {
			  if(p1->getnext()==NULL)p2->setnext(NULL);
			  else 
			   {p1->getnext();
		        p2->setnext(p1);
			   }
			   sum--;
		    }
		  
		 }
		 
		void getave()
		 { int num;
		   cout<<"请输入要查询的学生学号"<<endl;
		   cin>>num; 
		   student *p1;
		   p1=head;
		   if(head==NULL){cout<<"查无此项"<<endl;}
		   while(p1->getnum()!=num) 
		     {
			  p1=p1->getnext();
			 } 
		   if(p1->getnum()==num)
		     {
			  cout<<p1->getnum()<<"的平均成绩是"<<p1->aveage()<<endl;
		    }
		   else
		     cout<<"查无此项"<<endl; 
		 }
		 
};
int main(int argc, char *argv[]) {
	studentlist www;
	int choice;
	while(1)
	{www.show();
	 cin>>choice;
	 switch (choice)
         {
          case 1:
              www.creat();
              break;
          case 2:
              www.insert();
              break;
          case 3:
              www.del();
              break;
          case 4:
          	  www.print();
          case 5:
              exit(1);
              break;
          case 6:
          	  www.getave();
          	  break;
          }
    }
	return 0;
}

可能代码不是很简洁,我我我尽力了。请大佬们将就看。

调试的时候就出现了题头的那个错误:Program received signal SIGSEGV, Segmentation fault,系统提示的断点是在38行getnext那个函数

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • rubikchen 502203305 4月前

    空指针异常,建议调试。

    vc 6.0支持调试。

    点赞 1 评论 复制链接分享
  • weixin_42910064 泡视界 4月前

    SIGSEGV 一般就是访问了无效的内存,

    经验看来可能是索引越界,

    指针未初始化,等问题。

    需要你自己检查

    点赞 1 评论 复制链接分享

相关推荐