c++写单链表,析构函数delete触发断点,如何修复?
问题应该是指针越界,如何修改?
、
源代码:
#include <iostream>
using namespace std;
//带头节点的单链表
template<class T>
struct Node
{
T date;
Node<T>*next;
};
template<typename T>
class headLinkList
{
public:
//成员函数
headLinkList()
{
length = 0;
head = new Node<T>;
head->next = 0;
}
//头插法构造
headLinkList(T a[], int n);
//尾插法构造
headLinkList(T a[], int n, int b);
//按关键字大小顺序插入
void seqinsert(T x);
//查找
Node<T>* GetElem(headLinkList list, T x);
//获取链表长度
int GetLength(headLinkList list)
{
cout << "length= " << length << endl;
return length;
}
T Delete(int n);
void show()
{
if(head->next==NULL)throw"链表为空";
Node<T>*p = head->next;
while (!p->next)
{
cout << p->date << " ";
p = p->next;
}cout <<p->date<< endl;
}
Node<T>* GetElem(Node<T>*head,int num)//得到第num位的节点地址
{
if (head->next == NULL)throw"链表为空";
Node<T>*p = head;
while (p->next != NULL)
{
p = p->next;
}return p;
}
~headLinkList()
{
Node<T> *tempptr;
while (head->next != NULL)
{
tempptr = head->next;
delete head;
head = tempptr;
}
delete head;
}
private:
Node<T>*head;
int length;
};
template<class T>
headLinkList<T>::headLinkList(T a[], int n)
{
head = new Node<T>;
head->next = NULL;
for (int i = 0; i < n; i++)
{
Node<T>*p = new Node<T>;
p->date = a[i];
p->next = head->next;
head->next = p;
length++;
}
}
template<class T>
headLinkList<T>::headLinkList(T a[], int n, int b)
{
head = new Node<T>;
head->next = NULL;
Node<T>*p = head;
for (int i = 0; i < n; i++)
{
Node<T>*temp = new Node<T>;
temp->date = a[i];
p->next = temp;
p = temp;
length++;
/*p->next = NULL;*/
}
}
template <class T>
void headLinkList<T>::seqinsert(T x)
{
if(head->next==NULL)throw"链表为空"
Node<T>*p = head;
Node<T>*temp = head;
Node<T>*x = new Node<T>;
x->date = x;
while (p->next)
{
p = p->next;
if (x->date <= p->date)
{
temp->next = x;
x->next = p;
length++;
return 0;
}
temp = temp->next;
}
p->next = x;
length++;
x->next = NULL;
}
template<typename T>
T headLinkList<T>::Delete(int n)
{
/*if (n > length || n < 1)throw"链表为空";*/
Node<T>*p = head;
int i = 0;
while (i<n-1)
{
p = p->next;
i++;
}
Node<T>*x = p->next;
p->next = x->next;
T l = x->date;
delete x;
length--;
x = NULL;
cout << "delete了" << l << endl;
return 0;
}
template<class T>
Node<T>* headLinkList<T>::GetElem(headLinkList list, T x)
{
if (head->next == Null)throw"链表为空"
Node<T>*p = head;
while (p->next)
{
p = p->next;
if (p->date == x)
{
return p;
}
}
return 0;
}
int main()
{
try {
int arr[] = { 1,2,5,9,7 };
cout << "test" << endl;
//头插法构造函数
headLinkList<int> mode1(arr, 5);
//尾插法构造函数
headLinkList<int>mode2(arr, 5, 0);
//遍历链表
cout << "mode1:"; mode1.show();
cout << endl;
cout << "mode2:"; mode2.show();
cout << endl;
mode1.Delete(2);
mode2.GetLength(mode2);
}
catch (const char*s)
{
cout << s << endl;
}
}