-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlinkList.cpp
128 lines (128 loc) · 2.65 KB
/
linkList.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include<iostream>
#include"error.cpp"
template<class T>
class linkList
{
private:
struct Node
{
T data;
Node*next;
Node():next(NULL){}
Node(T x,Node*p=NULL):data(x),next(p){}
};
Node*head;
int len;
public:
linkList();
~linkList();
void remove(const T&x);
void insert(const T&x);
bool exist(const T&x)const;
void traverse() const;
void reverse();
T& at(int index);
T& operator[](int index);
void del(int index);
};
template<class T>
linkList<T>::linkList()
{
head=new Node();//需要一个空结点,为了插入和删除的方便
len=0;
}
template<class T>
linkList<T>::~linkList()
{
Node*tmp;
while(head)
{
tmp=head;
head=head->next;
delete tmp;
}
}
template<class T>
void linkList<T>::remove(const T&x)
{
Node*p=head;
while(p->next&&p->next->data!=x) //找到x之前的一个节点,同时一定要注意判断指针是否为空,否则程序会异常终止。
p=p->next;
if(!(p->next))
return;
Node*tmp=p->next;
p->next=tmp->next;
delete tmp;
len--;
}
template<class T>
void linkList<T>::insert(const T&x)
{
Node*tmp=new Node(x,head->next);
head->next=tmp;
len++;
}
template<class T>
bool linkList<T>::exist(const T&x)const
{
Node*p=head->next;//要跳过空结点
while(p&&p->data!=x)
p=p->next; //写程序记得要p->p->ext,不要忘记。
return p;
}
template<class T>
void linkList<T>::traverse()const
{
Node*p=head->next;
while(p)
{
std::cout<<p->data<<' ';
p=p->next;
}
}
template<class T>
void linkList<T>::reverse()
{
Node*p1,*p2=NULL;//p2初始一定要置零
while(head->next)
{
p1=head->next;
head->next=p1->next;
p1->next=p2;
p2=p1;
}
head->next=p2;//!!!!!一定要把链表链回去
}
template<class T>
T &linkList<T>::at(int index)
{
if(index>=len)
throw error("linkList<T>::at(int index) out of boundary ");
Node*p=head;
for(int i=0;i<len-index;++i)
p=p->next;
return p->data;
}
template<class T>
T &linkList<T>::operator[](int index)
{
if(index>=len)
throw error("linkList<T>::operator[](int index) out of boundary ");
Node*p=head;
for(int i=0;i<len-index;++i)
p=p->next;
return p->data;
}
template<class T>
void linkList<T>::del(int index)
{
if(index>=len)
return;
Node*p=head;
for(int i=0;i<len-index-1;++i)
p=p->next;
Node*tmp=p->next;
p->next=tmp->next;
delete tmp;
len--;
}