求救大虾,帮我看一下这个C++单链表源程序里面是不是有野指针,总是提示我什么内存访问冲突,在线等!!急
我只发头文件好了,.CPP文件应该没有问题#include<iostream>#include<stdio.h>usingnamespacestd;#defineNULL...
我只发头文件好了,.CPP文件应该没有问题
#include <iostream>
#include <stdio.h>
using namespace std;
#define NULL 0
#define ERROR 0
//===============================
typedef int ElemType;
typedef struct LNode{//结点定义,并且重命名为LNode(结点),pNode(指针)
ElemType data;
struct LNode *next;
}LNode,*pNode;
//===============================
//标准函数的定义
pNode Creat_List(LNode *head){ //建立一个含有头结点的空链表
head=(pNode)malloc(sizeof(LNode));
if(!head) {cout<<"空间申请失败!"<<endl;return NULL;}
else
head->data=NULL;
head->next=NULL;
return head;
}
pNode Init_List(LNode *head,int n){ //初始化链表,n个ElemType类型的数据
pNode p = head;
pNode r = NULL;
int i=0;
while(i<n){
r=(pNode)malloc(sizeof(LNode));
if(!r){cout<<"ERROR!"<<endl;return NULL;}
else
p->next=r;
cin>>(*r).data;
p=p->next;
i++;
}
return(head);
}
int Len_List(LNode *head){ //求单链表的长度
pNode p= head;
int Len=0;
while(!(p->next)){
Len++;
p=p->next;}
return(Len);
}
void Print_List(LNode *head,int Len){ //打印单链表
pNode p=head;
if(!head){cout<<"这是一个空的链表"<<endl;return;}
else
while(p->next){
cout<<p->next->data<<" ";
p=p->next;}
}
貌似有好几处。。。。但是我怎么也找不出来。。。像这种野指针问题应该怎么DEBUG呢。。。。 展开
#include <iostream>
#include <stdio.h>
using namespace std;
#define NULL 0
#define ERROR 0
//===============================
typedef int ElemType;
typedef struct LNode{//结点定义,并且重命名为LNode(结点),pNode(指针)
ElemType data;
struct LNode *next;
}LNode,*pNode;
//===============================
//标准函数的定义
pNode Creat_List(LNode *head){ //建立一个含有头结点的空链表
head=(pNode)malloc(sizeof(LNode));
if(!head) {cout<<"空间申请失败!"<<endl;return NULL;}
else
head->data=NULL;
head->next=NULL;
return head;
}
pNode Init_List(LNode *head,int n){ //初始化链表,n个ElemType类型的数据
pNode p = head;
pNode r = NULL;
int i=0;
while(i<n){
r=(pNode)malloc(sizeof(LNode));
if(!r){cout<<"ERROR!"<<endl;return NULL;}
else
p->next=r;
cin>>(*r).data;
p=p->next;
i++;
}
return(head);
}
int Len_List(LNode *head){ //求单链表的长度
pNode p= head;
int Len=0;
while(!(p->next)){
Len++;
p=p->next;}
return(Len);
}
void Print_List(LNode *head,int Len){ //打印单链表
pNode p=head;
if(!head){cout<<"这是一个空的链表"<<endl;return;}
else
while(p->next){
cout<<p->next->data<<" ";
p=p->next;}
}
貌似有好几处。。。。但是我怎么也找不出来。。。像这种野指针问题应该怎么DEBUG呢。。。。 展开
2个回答
展开全部
#include <iostream>
#include <stdio.h>
using namespace std;
//#define NULL 0
//#define ERROR 0
//===============================
typedef int ElemType;
typedef struct LNode{//结点定义,并且重命名为LNode(结点),pNode(指针)
ElemType data;
struct LNode *next;
}LNode,*pNode;
//===============================
//标准函数的定义
pNode Creat_List(void){ //建立一个含有头结点的空链表
LNode *head;
head=(pNode)malloc(sizeof(LNode));
if(!head) {cout<<"空间申请失败!"<<endl;return NULL;}
else
{
memset(head, 0, sizeof(LNode));
head->data=0;
head->next=NULL;
}
return head;
}
pNode Init_List(LNode *head, int n){ //初始化链表,n个ElemType类型的数据
pNode p = head;
pNode r = NULL;
int i=0;
while(i<n){
r=(pNode)malloc(sizeof(LNode));
if(!r){cout<<"ERROR!"<<endl;return NULL;}
else
{
memset(r, 0, sizeof(LNode));
p->next=r;
//cin>>r->data;
r->data = i;
printf ("i=%d\n", i);
p=p->next;
i++;
}
}
return(head);
}
int Len_List(LNode *head){ //求单链表的长度
pNode p= head;
int Len=0;
while(p){
Len++;
p=p->next;
}
return(Len);
}
void Print_List(LNode *head,int Len){ //打印单链表
pNode p=head;
if(!head){cout<<"这是一个空的链表"<<endl;return;}
else
while(p){
cout<<p->data<<endl;
p=p->next;
}
}
int main()
{
pNode head;
head = Creat_List();
Init_List (head, 10);
Print_List(head, 10);
system("pause");
return 0;
}
每个malloc 后的内存最好进行memset(r,0,sizeof(*r));
Creat_List(); 不需要参数即可。
注意if else 括号注意添加。
NULL不必定义。
#include <stdio.h>
using namespace std;
//#define NULL 0
//#define ERROR 0
//===============================
typedef int ElemType;
typedef struct LNode{//结点定义,并且重命名为LNode(结点),pNode(指针)
ElemType data;
struct LNode *next;
}LNode,*pNode;
//===============================
//标准函数的定义
pNode Creat_List(void){ //建立一个含有头结点的空链表
LNode *head;
head=(pNode)malloc(sizeof(LNode));
if(!head) {cout<<"空间申请失败!"<<endl;return NULL;}
else
{
memset(head, 0, sizeof(LNode));
head->data=0;
head->next=NULL;
}
return head;
}
pNode Init_List(LNode *head, int n){ //初始化链表,n个ElemType类型的数据
pNode p = head;
pNode r = NULL;
int i=0;
while(i<n){
r=(pNode)malloc(sizeof(LNode));
if(!r){cout<<"ERROR!"<<endl;return NULL;}
else
{
memset(r, 0, sizeof(LNode));
p->next=r;
//cin>>r->data;
r->data = i;
printf ("i=%d\n", i);
p=p->next;
i++;
}
}
return(head);
}
int Len_List(LNode *head){ //求单链表的长度
pNode p= head;
int Len=0;
while(p){
Len++;
p=p->next;
}
return(Len);
}
void Print_List(LNode *head,int Len){ //打印单链表
pNode p=head;
if(!head){cout<<"这是一个空的链表"<<endl;return;}
else
while(p){
cout<<p->data<<endl;
p=p->next;
}
}
int main()
{
pNode head;
head = Creat_List();
Init_List (head, 10);
Print_List(head, 10);
system("pause");
return 0;
}
每个malloc 后的内存最好进行memset(r,0,sizeof(*r));
Creat_List(); 不需要参数即可。
注意if else 括号注意添加。
NULL不必定义。
展开全部
pNode Creat_List(LNode *head){ //建立一个含有头结点的空链表
head=(pNode)malloc(sizeof(LNode));
if(!head) {cout<<"空间申请失败!"<<endl;return NULL;}
else
head->data=NULL;
head->next=NULL;
return head;
}
你是不是类似这样调用这个函数Creat_List(head);这样就错了,因为传进去的只是head的一个副本,你可以把断点设在Creat_List函数以后,看看Creat_List是否正确,
有两种方法可以解决:
1.把LNode *head声明为全句变量,然后调用Creat_List()的时候就不用传参数啦,直接用head指针
2.Creat_List(head)改为head = Creat_List(head);
由于我不知道你是怎么调用的,所以只能这样猜测,不过我觉得你很有可能是这样问题
head=(pNode)malloc(sizeof(LNode));
if(!head) {cout<<"空间申请失败!"<<endl;return NULL;}
else
head->data=NULL;
head->next=NULL;
return head;
}
你是不是类似这样调用这个函数Creat_List(head);这样就错了,因为传进去的只是head的一个副本,你可以把断点设在Creat_List函数以后,看看Creat_List是否正确,
有两种方法可以解决:
1.把LNode *head声明为全句变量,然后调用Creat_List()的时候就不用传参数啦,直接用head指针
2.Creat_List(head)改为head = Creat_List(head);
由于我不知道你是怎么调用的,所以只能这样猜测,不过我觉得你很有可能是这样问题
更多追问追答
追问
前面不提示访问冲突了,可是那个打印的倒数第二句,就是cout……的还是一样的问题。。。
追答
就是因为你创建列表有误,或者添加元素有误才会打印出错啊,你是怎么调用这个Creat_List函数的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询