简单链表有关问题
简单链表问题
我怎么也找不到错误,编译、连接都没问题,运行就内存错误。
我仅仅是想在不排序的情况下实现两个链表的交集。
您抽出时间看一下我万分感谢!!
#include <iostream.h>
#include <malloc.h>
#include <stdlib.h>
struct LNode
{
int data;
struct LNode* next;
};
void CreateList(LNode* &l,int n)
{
l=(LNode*)malloc(sizeof(LNode));
l-> next=NULL;
for(int i=n;i> 0;--i)
{
LNode* p=(LNode*)malloc(sizeof(LNode));
cin> > p-> data;
p-> next=l-> next;
l-> next=p;
}
}
void ShowList(LNode* &l)
{
LNode* p=l-> next;
while(p)
{
cout < <p-> data < < " ";
p=p-> next;
}
cout < <endl;
}
void Interest(LNode* &la,LNode* &lb)
{
//关键就是这个函数了!!
LNode* pa=la-> next;
LNode* pb=lb-> next;
LNode* p=la;
while(pa)
{
int i=0;
while(pb)
{
if(pa-> data==pb-> data) {i=1;break;}
else {pb=pb-> next;}
}
if(i=1)
{p=pa;pa=pa-> next;}
if(i=0)
{
p-> next=pa-> next;
free(pa);
pa=p-> next;
}
pb=pb-> next;
}
}
void main()
{
int m,n;
cout < < "请输入第一个链表长度: ";
cin> > m;
LNode *p,*q;
CreateList(p,m);
ShowList(p);
cout < < "请输入第二个链表长度: ";
cin> > n;
CreateList(q,n);
ShowList(q);
cout < < "两个链表的交集: " < <endl;
Interest(p,q);
ShowList(p);
}
------解决方案--------------------
while(pb) // step 1
{
if(pa-> data==pb-> data)
{
i=1;
break;
}
else
{
pb=pb-> next;
}
}
if(i=1)
{
p=pa;pa=pa-> next;}
if(i=0)
{
p-> next=pa-> next;
free(pa);
pa=p-> next;
}
// step2 , 在step1的时候,没有执行break的情况下,pb跳出循环时值为NULL,这个地址是不允许访问的,导致你的程序出错.加上判断即可避免
if (pb)
{
pb=pb-> next;
}
我怎么也找不到错误,编译、连接都没问题,运行就内存错误。
我仅仅是想在不排序的情况下实现两个链表的交集。
您抽出时间看一下我万分感谢!!
#include <iostream.h>
#include <malloc.h>
#include <stdlib.h>
struct LNode
{
int data;
struct LNode* next;
};
void CreateList(LNode* &l,int n)
{
l=(LNode*)malloc(sizeof(LNode));
l-> next=NULL;
for(int i=n;i> 0;--i)
{
LNode* p=(LNode*)malloc(sizeof(LNode));
cin> > p-> data;
p-> next=l-> next;
l-> next=p;
}
}
void ShowList(LNode* &l)
{
LNode* p=l-> next;
while(p)
{
cout < <p-> data < < " ";
p=p-> next;
}
cout < <endl;
}
void Interest(LNode* &la,LNode* &lb)
{
//关键就是这个函数了!!
LNode* pa=la-> next;
LNode* pb=lb-> next;
LNode* p=la;
while(pa)
{
int i=0;
while(pb)
{
if(pa-> data==pb-> data) {i=1;break;}
else {pb=pb-> next;}
}
if(i=1)
{p=pa;pa=pa-> next;}
if(i=0)
{
p-> next=pa-> next;
free(pa);
pa=p-> next;
}
pb=pb-> next;
}
}
void main()
{
int m,n;
cout < < "请输入第一个链表长度: ";
cin> > m;
LNode *p,*q;
CreateList(p,m);
ShowList(p);
cout < < "请输入第二个链表长度: ";
cin> > n;
CreateList(q,n);
ShowList(q);
cout < < "两个链表的交集: " < <endl;
Interest(p,q);
ShowList(p);
}
------解决方案--------------------
while(pb) // step 1
{
if(pa-> data==pb-> data)
{
i=1;
break;
}
else
{
pb=pb-> next;
}
}
if(i=1)
{
p=pa;pa=pa-> next;}
if(i=0)
{
p-> next=pa-> next;
free(pa);
pa=p-> next;
}
// step2 , 在step1的时候,没有执行break的情况下,pb跳出循环时值为NULL,这个地址是不允许访问的,导致你的程序出错.加上判断即可避免
if (pb)
{
pb=pb-> next;
}