我是靠谱客的博主 粗犷八宝粥,最近开发中收集的这篇文章主要介绍双向循环链表,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


#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




最后

以上就是粗犷八宝粥为你收集整理的双向循环链表的全部内容,希望文章能够帮你解决双向循环链表所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部