之前一直没怎么在意C++中的链表,但是突然一下子让自己写,就老是出错。没办法,决定好好恶补一下该方面的知识,也为今后的数据结构大下个良好的基础,于是我总结出以下几点,有些地方可能不正确,还望大家不吝赐教,旨在共同进步。
总结:
1、链表List的基本单元是节点Node,因此想要操作方便,就必须为每一步打好基础,Node的基本结构如下:
1
2
3
4
5
6
7
8
9
|
class Node{
public :
int data;
Node *next;
Node( int da=0,Node *p=NULL){
this ->data=da;
this ->next=p;
}
};
|
我们可以看出,Node的成员变量一共有两个,都是public,因为我们要对这两个变量进行操作,所以不能是private类型的。然后是一个构造函数,第二个参数默认值为NULL,也就是说如果我们创建新节点时只指定第一个参数,而不写第二个参数,那么它默认的就是NULL,以这种方式可以更灵活的使用Node,个人建议这么使用哦。
2、第二步就是创建我们的链表了,同样我们这里先给出链表的代码,在进行一一的解释。
1
2
3
4
5
6
7
8
9
10
11
12
|
class List{
private :
Node *head,*tail;
int position;
public :
List(){head=tail=NULL;};
~List(){ delete head; delete tail;};
void print();
void Insert( int da=0);
void Delete( int da=0);
void Search( int da=0);
};
|
我们这里面有两个数据类型,一个是Node。另一个是指代节点位置的成员变量(起不到什么作用,且不去管它吧)。使用head和tail来命名便是为了见名知意,使操作更加准确。然后是重要的六个函数,各自的功能不言而喻咯,其实最重要的是在每一个函数中我们都默认能操作head和tail两个成员变量,这样能简化我们的参数列表,使得函数更加优雅。
下面是我的一个单链表的实现,包含创建链表,插入值,删除特定的值,查找特定值得在链表中的位置。
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
129
130
131
132
133
134
135
136
137
138
139
140
|
#include<iostream>
using namespace std;
class Node{
public :
int data;
Node *next;
Node( int da=0,Node *p=NULL){
this ->data=da;
this ->next=p;
}
};
class List{
private :
Node *head,*tail;
int position;
public :
List(){head=tail=NULL;};
~List(){ delete head; delete tail;};
void print();
void Insert( int da=0);
void Delete( int da=0);
void Search( int da=0);
int getValueAt( int position);
void setValueAt( int position, int da);
};
int List::getValueAt( int position){
Node *p=head;
if (p==NULL){
cout<< "The List is Empty!" <<endl;
} else {
int posi=0;
while (p!=NULL&&posi!=position){
posi++;
p=p->next;
}
if (p==NULL){
cout<< "There is no value of this position in this List!" <<endl;
} else {
cout<< "In this Position,the value is" <<p->data<<endl;
}
}
return p->data;
}
void List::setValueAt( int position, int da){
Node *p=head;
if (p==NULL){
cout<< "The List is Empty!" <<endl;
} else {
int posi=0;
while (p!=NULL&&posi!=position){
posi++;
p=p->next;
}
if (p==NULL){
cout<< "There is No Position in this List!" <<endl;
} else {
p->data=da;
cout<< "The Value in this position has been Updated!" <<endl;
}
}
}
void List::Search( int da){
Node *p=head;
if (p==NULL){
cout<< "Sorry, The List is Empty!" <<endl;
return ;
}
int count=0;
while (p!=NULL&&p->data!=da){
p=p->next;
count++;
}
cout<< "the value you want to search is at position %d" <<count<<endl;
}
void List::Delete( int da){
Node *p=head,*q=head;
if (p==NULL){
cout<< "Sorry, The List is Empty!" <<endl;
return ;
}
while (p!=NULL&&p->data!=da){
q=p;
p=p->next;
}
q->next=p->next;
cout<< "The Deletion Operation had been finished!" <<endl;
}
void List::Insert( int da){
if (head==NULL){
head=tail= new Node(da);
head->next=NULL;
tail->next=NULL;
} else {
Node *p= new Node(da);
tail->next=p;
tail=p;
tail->next=NULL;
}
}
void List::print(){
Node *p=head;
while (p!=NULL){
cout<<p->data<< " \a" ;
p=p->next;
}
cout<<endl;
}
int main(){
cout<< "Hello World!" <<endl;
List l1;
l1.Insert(1);
l1.Insert(2);
l1.Insert(3);
l1.Insert(4);
l1.Insert(5);
l1.Insert(6);
l1.Insert(7);
l1.print();
l1.Search(4);
l1.Delete(6);
l1.print();
l1.getValueAt(3);
l1.setValueAt(3,9);
l1.print();
cout<< "The End!" <<endl;
return 0;
}
//在此我想解释的是,之所以数字4在链表中的位置为3,是因为其是从零开始计数的
|
下面是代码运行后的结果:
好了,单链表的基本操作大致就是这样了,希望我们都能从中有所收获。如果您发现代码中有什么错误,还望不吝赐教,让我们共同进步吧。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!