Program received signal SIGSEGV问题解决

关于Program received signal SIGSEGV问题解决

前几天在写数据结构实验的时候遇到一个地方卡壳,导致几天没进展,心情弄的很烦躁

项目场景:

相关背景:在进行数据结构实验过程中,是采用菜单的形式进行链表的操作
部分代码如下

#include<iostream>
#include<stdlib.h>
using namespace std;
//菜单 
void Menu_show(){
	cout<<"1---初始化一个线性表"<<endl; 
	cout<<"2---销毁线性表"<<endl; 
	cout<<"3---清空线性表"<<endl; 
	cout<<"4---判断线性表是否为空"<<endl; 
	cout<<"5---求线性表长度 "<<endl; 
	cout<<"6---获取线性表中指定位置的元素"<<endl; 
	cout<<"7---获取线性表中元素的位置"<<endl; 
	cout<<"8---求前驱"<<endl; 
	cout<<"9---求后继"<<endl; 
	cout<<"10--在线性表指定位置插入元素"<<endl; 
	cout<<"11--删除线性表指定位置的元素"<<endl; 
	cout<<"12--显示线性表"<<endl; 
	cout<<"13--合并两个非递减有序的线性表"<<endl; 
	cout<<"      退出!输入一个负数  "<<endl; 
}
//结构体 链式结构-单链表 
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*Linklist;
//链表的初始化
Linklist initList(){
	LNode *head;
	head=(LNode *)malloc(sizeof(LNode));
	//判断为空时,即为初始化失败 
	if(head==NULL){
		cout<<"初始化失败!"<<endl; 
	}
	else
	cout<<"初始化成功!"<<endl; 
	head->next=NULL;
	return head;
}
//链表的销毁,逐个释放结点内存空间 (包括头指针)
void DestoryList(LNode *head){
	LNode*p;
	while(head){
		p=head->next;
		free(head);
		head=p;
	}
	cout <<"链表以成功销毁!"<<endl;
}
//链表的清空,逐个释放结点内存空间 (除了头指针)
void ClearList(LNode *head){
	LNode *p,*b;
	if(head->next==NULL){
		cout<<"该链表为空表,不需要清空!"<<endl;
	}
	else{
		p=head->next;
		while(p){
			b=p->next;
			free(p);
			p=b;
		}
		head->next=NULL;
		cout<<"链表已成功清空!"<<endl;
		}
	
} 
//判断线性表是否为空 
void ListEmpty(LNode*head){
	// 头指针为空即为链表length=0 
	if(head->next==NULL){
		cout<<"该链表为空!"<<endl;
	}
	else
	cout<<"该链表不为空!"<<endl; 
}
//链表长度的判断 
int ListLength(LNode*head){
	//count计数 
	int count=0;
	LNode *p;
	p=head;
	while(p->next!=NULL){
		count += 1;
		p=p->next;
	}
	return count;
}
//获取某个位置的元素 
void GetElem(LNode*head,int n){
	LNode*p;
	p=head;
	if(ListLength(head)>=n){//判断位置是否超出了链表的长度 
		for(int i=1;i<=n;i++){
			p=p->next;
		}
		cout<<"第"<<n<<"个数为:"<<p->data<<endl; 
	}
	else
		cout<<"你输入的位置不在链表范围内!无法输入该位置的元素。"<<endl; 
	
} 
//求某个位置的前驱元素 
void PeiorElem(LNode*head,int n){
	
}
//求某个位置的后继元素
void NextElem(LNode*head,int n){
	
} 
//在线性表中指定位置插入元素 
void ListInsert(LNode*head,int n,int data){
	LNode *p,*temp;
	while(n<0||n>ListLength(head)+1){
		cout<<"插入位置不在链表范围内,请重新输入位置:";
		cin>>n;
	}
	if(ListLength(head)==0){//当链表为空表时 
		if(n!=1){
			cout<<"链表为空,需要从第一位进行插入!"<<endl; 
		} 
		else{
			p=(LNode*)malloc(sizeof(LNode));
			head->next=p;
			p->data=data;//错误地方
			//此添加p->next后程序可以正常进行
			P->next=NULL;
		}
		
	}
	else if(n==ListLength(head)+1){//直接在表尾进行插入 
		temp=head;
		while(temp->next!=NULL){
			temp=temp->next;
		}
		p=(LNode*)malloc(sizeof(LNode));
		p->data=data;
		p->next=NULL; //此时插入的位置为最后一位,next为空 
		temp->next=p;
	} 
	{	
		temp=head;//链表不为空的时 
		for(int i=1;i<n;i++){//找到需要插入位置的前一位 
			temp=temp->next;
		}
		p=(LNode*)malloc(sizeof(LNode));
		p->data=data;
		p->next=temp->next;
		temp->next=p;
	} 
	
	cout<<"插入成功!"<<endl; 
}
//删除线性表中指定位置的元素
void ListDelete(LNode*head,int n){
	LNode* temp=head;
	while(n<0||n>ListLength(head)){
		cout<<"您输入的位置不在链表中,请重新输入:";
		cin>>n;
	}
	
	for(int i=1;i<n;i++){//与插入同样也是找到删除位置的上一位 
		temp=temp->next;
	}
	temp->next=temp->next->next;
	cout<<"删除成功!"<<endl;
}
	
	
 
//显示线性表
//合并两个非递减有序的线性表
int main(){
	Menu_show();
	int num;
	int length,s,data;
	LNode M_List; 
	Linklist  head;
	cout<<"请输入选项:"; 
	cin>>num;
	while(num!=1&&num>=0&&num<=13){
			cout<<"请先初始化线性表!"<<endl;
			cout<<"请重新输入选项:";
			cin>>num;
		}
	while(num>=0){
		
		switch(num){
			case 1:
					head=initList();
					break;
			case 2:
					DestoryList(head);
					break;
			case 3:
					ClearList(head);
					break;
			case 4:
					ListEmpty(head);
					break;	
			case 5:
				length =ListLength(head);
				cout <<"链表的长度为"<<length<<endl; 
				break;
			case 6:
				cout<<"请输入你要查看的位置:";
				cin>>s;
				GetElem(head,s);
				break;
			case 10:
				cout<<"请输入插入的位置和数据:";
				cin>>s;
				cin>>data;
				head=ListInsert(head,s,data);
				break;
			default:cout<<"您输入选项有误!"<<endl; 
		}
		cout<<"请输入选项:";
		cin>>num; 
	}
	if(num<0){
		cout<<"结束!"<<endl; 
	}
	
} 


问题描述:

遇到的问题:程序编程无误,刚开始可以成功运行几个while循环,但是在第一次插入数据元素后,进行链表长度的查询时,输入5选项,程序无反应
exe 中:

1---初始化一个线性表
2---销毁线性表
3---清空线性表
4---判断线性表是否为空
5---求线性表长度
6---获取线性表中指定位置的元素
7---获取线性表中元素的位置
8---求前驱
9---求后继
10--在线性表指定位置插入元素
11--删除线性表指定位置的元素
12--显示线性表
13--合并两个非递减有序的线性表
      退出!输入一个负数
请输入选项:1
初始化成功!
请输入选项:5
链表的长度为0
请输入选项:10
请输入插入的位置和数据:1
10
插入成功!
请输入选项:5
——

原因分析:

指针越界,导致链表的长度不正确

解决方案:

在插入结构元素中,将最后一个元素的next设置为NULL

void ListInsert(LNode*head,int n,int data){
	LNode *p,*temp;
	while(n<0||n>ListLength(head)+1){
		cout<<"插入位置不在链表范围内,请重新输入位置:";
		cin>>n;
	}
	if(ListLength(head)==0){//当链表为空表时 
		if(n!=1){
			cout<<"链表为空,需要从第一位进行插入!"<<endl; 
		} 
		else{
			p=(LNode*)malloc(sizeof(LNode));
			head->next=p;
			p->data=data;
			
			//错误地方
			//此添加p->next后程序可以正常进行
			P->next=NULL;
		}
		
	}
	else if(n==ListLength(head)+1){//直接在表尾进行插入 
		temp=head;
		while(temp->next!=NULL){
			temp=temp->next;
		}
		p=(LNode*)malloc(sizeof(LNode));
		p->data=data;
		p->next=NULL; //此时插入的位置为最后一位,next为空 
		temp->next=p;
	} 
	{	
		temp=head;//链表不为空的时 
		for(int i=1;i<n;i++){//找到需要插入位置的前一位 
			temp=temp->next;
		}
		p=(LNode*)malloc(sizeof(LNode));
		p->data=data;
		p->next=temp->next;
		temp->next=p;
	} 
	
	cout<<"插入成功!"<<endl; 
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值