小弟欲新建一双向循环链表,对链表中符合删除条件的数据进行删除操作。整个程序编译无bug,运行中断。主函数运行到新建链表后打印函数中的cout<data<<" ";VS2010显示的错误为“0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突”,求大神指教,是否是我新建链表的函数或宏定义中new和delete函数使用错误,还是我新建双向循环链表的算法有问题啊,望不吝赐教!!!
以下是部分代码,包含新建函数和打印函数:
#include
#define CreateNode(x) x = new BLPtr
#define DeleteNode(x) delete []x
using namespace std;
struct BLPtr
{
char data;
struct BLPtr *prior;
struct BLPtr *next;
};
struct BLPtr *creat(void);
void print(struct BLPtr *p);
bool beErased(char);
//struct BLPtr erase(struct BLPtr *p);
int erase(struct BLPtr *p);
int main()
{
struct BLPtr *p;
p = creat();
cout<<"原始链表数据为:"<<endl;
print(p);
erase(p);
cout<<"处理后链表数据为:"<<endl;
print(p);
return 0;
}
struct BLPtr *creat(void)
{//建立一个无附加头结点的双向循环链表
struct BLPtr *head,*p1,*p2;
head = p1 = CreateNode(p2);//新建第一个结点
cout<<"请输入第一个结点数据:";
cin>>p2->data;//输入第一个结点数据
while(p2->data != '#')//输入“#”结束
{
p2->prior = p1;//后方前驱指针指向前方结点
p1->next = p2;//前方后继指针指向后方结点
CreateNode(p2);//新建结点
cout<<"请继续输入:";
cin>>p2->data;//输入新节点数据
}
head->prior = p1;//头结点前驱指针指向尾结点
p1->next = head;//尾结点后继指针指向头结点
head = p2;//删除最后无用结点和指针
DeleteNode(p2);
return p1;
}
void print(struct BLPtr *p)
{
struct BLPtr *pn;
pn = p->next;
while(pn != p)//输出除p以外的结点数据
{
cout<data<<" ";//运行中断,求指教
pn = pn->next;//沿next向下搜索
}
cout<data<<endl;//输出最后一个结点数据
}