双向循环链表


#include "stdafx.h"
#include "BLinkList.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	int a[]={1,2,3,4};
	int n;
	BLinkList<int> blist(a,4);
	blist.PrintList();

	n=3;
	blist.Insert(100,n);
	cout << "在位置" << n << "插入后:" ;
	blist.PrintList();

	n=3;
	blist.Delete(n);
	cout << "在位置" << n << "删除后:" ;
	blist.PrintList();

	int x=0;
	cout << "元素" << x << "位于" << blist.Locate(x) << endl;
	
	cout << "位置i处元素:" << blist.Get(-1) << endl;	

	return 0;
	
}
文件"BLinkList.h"
template<class T>
struct Node{
	Node<T> *prior;
	T data;	
	Node<T> *next;
};

template<class T>
class BLinkList
{
private:
	Node<T> *front;
public:
	BLinkList();
	BLinkList(T a[], int n);

	void Delete(int i);
	void Insert(T x, int i);
	T Get(int i);
	int Locate(T x);
	void PrintList();
};

template<class T>
BLinkList<T>::BLinkList()
{
	//Node<T> *front = new Node<T>;
	front = new Node<T>;
	front->next = front->prior;
	front->prior = front->next;
	//cout << "双向循环链表为空" <<endl;
}

template<class T>
BLinkList<T>::BLinkList(T a[], int n)
{
	//Node<T> *front = new Node<T>;
	front = new Node<T>;
	front->next = front;
	front->prior = front;
	
	for(int i=n-1;i>=0;i--)
	{
		Node<T> *p = new Node<T>;
		p->data = a[i];
		p->next = front->next;
		front->next = p;
		p->next->prior = p;
		p->prior = front;
	}	
}

template<class T>
void BLinkList<T>::PrintList()
{/*打印双向循环链表*/
	Node<T> *p = front;
	while(front != p->next && p!= NULL)
	{
		cout << p->next->data << "  ";
		p = p->next;
	}
	cout << endl;
}

template<class T>
void BLinkList<T>::Insert(T x,int n)
{/*在位置n的节点处插入元素x*/
	Node<T> *p = front;
	int i = 1;
	while(i<n && p->next != front)
	{
		p = p->next;
		i++;
	}
	
		Node<T> *s = new Node<T>;
		s->data = x;
		s->next = p->next;
		p->next = s;
		s->next->prior = s;
		s->prior = p;
	
}

template<class T>
void BLinkList<T>::Delete(int n)
{/*删除位置为n的非头节点,非头节点从n=1开始*/
	Node<T> *p = front;
	int i=1;
	if(n<1) {cout << "插入位置太小" << endl;}
	else
	{
		while(i<n && p->next != front)
		{
			p = p->next;
			i++;
		}
		if(p->next == front){cout << "删除位置太大!" << endl;}
		else
		{
			Node<T> *s = p->next;
			p->next = s->next;
			s->next->prior = p;
			delete s;
		}
	}
}

template<class T>
int BLinkList<T>::Locate(T x)
{
	Node<T> *p = front;
	int i=1;
	while(p->next->data!=x && p->next!=front)
	{
		p = p->next;
		i++;
	}
	if(p->next == front) {cout << "x不存在!";return -1;}	
	else {return i;}

}

template<class T>
T BLinkList<T>::Get(int n)
{
	Node<T> *p = front;
	int i=1;
	if(n<1) 
	{cout << "位置太小!" ;return -1;}
	else
	{
		while(i!=n && p->next!=front)
		{
			p = p->next;
			i++;
		}
		if(p->next == front){cout << "位置太大!" ;return -1000000;}
		else{return p->next->data;}
	}
}


错误及心得:1,报错"缺少类型说明符 - 假定为 int。注意: C++ 不支持默认int"template"

template<class T>
class BLinkList
{
private:
	Node<T> *front;
public:
	BLinkList();
	BlinkList(T a[], int n); //BlinkList应为BLinkList;否则报错"缺少类型说明符 - 假定为 int。注意:C++不支持默认int"

	void Delete(int i);
	void Insert(T x, int i);
	T Get(int i);
	int Locate(T x);
	void PrintList();
};

2,报错:双向链表.exe 中的 0x008415d3 处有未经处理的异常: 0xC0000005: 读取位置 0xccccccd4 时发生访问冲突

原因:在成员函数中重新定义数据成员,导致数据成员为局部变量。

链接:http://topic.csdn.net/u/20120406/10/a7a31555-78b7-4ded-b926-f037b824f4f4.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值