数据结构-线性表-双向链表(c++)

单循环链表类似,但析构函数需要注意

  1. 析构函数:
    因为while循环的条件是p->next!=front,所以不能直接delete front;
template<class T>
TWLinkList<T>::~TWLinkList()
{
 Node<T>* p = front;
 while (p->next!=front)
 {
  Node<T>* temp = p;
  p = p->next;
  delete temp;
 }
 delete p;
}

所以不能直接delete front,这样会使判断语句失效(front被释放)

template<class T>
TWLinkList<T>::~TWLinkList()
{
 Node<T>* p = front;
 while (p->next!=front)
 {
  front = p;
  p = p->next;
  delete front;
 }
 delete p;
}

TowWayLinkList.h


#ifndef TOWWAYLINKLIST_H_
#define TOWWAYLINKLIST_H_
#include<iostream>
template<class T>
struct Node
{
 T data;
 struct Node<T>* prior;
 struct Node<T>* next;
};
template<class T>
class TWLinkList
{
private:
 Node<T>* front;
public:
 TWLinkList();
 TWLinkList(T a[],int n);
 ~TWLinkList();
 int GetLength()const;
 void Print()const;
 Node<T>* Get(int i);
 int Location(T x)const;
 void Insert(int i, T x);
 void Delete(int i);
 void Sort();
 void Connect(TWLinkList<T>& b);
};
template<class T>
TWLinkList<T>::TWLinkList()
{
 front = new Node<T>;
 front->next = front;
 front->prior = front;
}
template<class T>
TWLinkList<T>::TWLinkList(T a[], int n)
{
 front = new Node<T>;
 Node<T>* rear = front;
 for (int i = 0; i < n; i++)
 {
  Node<T>* s = new Node<T>;
  s->data = a[i];
  rear->next = s;
  s->prior = rear;
  rear = s;
 }
 rear->next = front;
 front->prior = rear;
}
template<class T>
TWLinkList<T>::~TWLinkList()
{
 Node<T>* p = front;
 while (p->next!=front)
 {
  Node<T>* temp = p;
  p = p->next;
  delete temp;
 }
 delete p;
}
template<class T>
int TWLinkList<T>::GetLength() const
{
 int i = 0;
 Node<T>* p = front;
 while (p->next != front)
 {
  p = p->next;
  i++;
 }
 return i;
}
template<class T>
void TWLinkList<T>::Print() const
{
 int i = 0;
 Node<T>* p = front->next;
 while (p->next != front)
 {
  std::cout << p->data << " ";
  if (i % 5 == 4)
   std::cout << std::endl;
  p = p->next;
  i++;
 }
 std::cout << front->prior->data << std::endl;
}
template<class T>
Node<T>* TWLinkList<T>::Get(int i)
{
 int j = 0;
 Node<T>* p = front;
 if (i == GetLength())return front->prior;
 while (p->next != front&&j!=i)
 {
  p = p->next;
  j++;
 }
 return p;
}
template<class T>
int  TWLinkList<T>::Location(T x)const
{
 int i = 0;
 Node<T>* p = front;
 if (x == front->prior->data) return GetLength();
 while (p->next != front)
 {
  p = p->next;
  i++;
  if (p->data == x)
   return i;
 }
 return -1;
}
template<class T>
void  TWLinkList<T>::Insert(int i, T x)
{
 Node<T>* p = front;
 if (i != 1)
  p = Get(i - 1);
 Node<T>* s = new Node<T>;
 s->data = x;
 s->next = p->next;
 p->next->prior = s;
 p->next = s;
 s->prior = p;
}
template<class T>
void  TWLinkList<T>::Delete(int i)
{
 Node<T>* p = front;
 if (i != 1)
  p = Get(i - 1);
 Node<T>* q = p->next;
 p->next->next->prior = p;
 p->next = q->next;
 delete q;
}
template<class T>
void  TWLinkList<T>::Sort()
{
 for (int i = 0; i < GetLength(); i++)
 {
  Node<T>* p = front->next;
  while (p->next != front)
  {
   if (p->data > p->next->data)
   {
    T t;
    t = p->next->data;
    p->next->data = p->data;
    p->data = t;
   }
   p = p->next;
  }
 }
}
template<class T>
void  TWLinkList<T>::Connect(TWLinkList<T>& b)
{
 Node<T>* p = b.front;
 b.front->next->prior = front->prior;
 front->prior->next = b.front->next;
 b.front->prior->next = front;
 front->prior = b.front->prior;
 p->next = p;
 p->prior = p;
}
#endif // !TOWWAYLINKLIST_H_

Use.cpp


#include<iostream>
#include"TowWayLinkList.h"
const int SIZE = 10;
int main()
{
    using std::cout;
    using std::endl;
    int ss[SIZE] = { 9,3,4,1,5,0,8,6,2,7 };
    int qq[5] = { 0,1,2,3,4 };
    TWLinkList<int> Grade(ss, SIZE);
    TWLinkList<int> B(qq, 5);
    cout << "链表内容:" << endl;
    Grade.Print();
    cout << "长度为:" << endl;
    cout << Grade.GetLength() << endl;
    cout << "查找5的位置:" << endl;
    cout << Grade.Location(5) << endl;
    cout << "删除第10个位置后的内容:" << endl;
    Grade.Delete(10);
    Grade.Print();
    cout << "此时长度为:" << endl;
    cout << Grade.GetLength() << endl;
    cout << "在第9个位置插入11的内容:" << endl;
    Grade.Insert(9, 11);
    Grade.Print();
    cout << "排序后:" << endl;
    Grade.Sort();
    Grade.Print();
    Grade.Connect(B);
    cout << "连接后:" << endl;
    Grade.Print();
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m晴朗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值