注意:没有使用malloc和free;加了一个头文件,用于清屏和暂停;还有就是一个错误特别容易被忽略,那就是主函数中声明了LinkList p,然后就直接创建链表,忘了给p分配空间。一定要先初始化链表再建立。以下代码说白了就是一个个的函数堆出来的,只是要注意函数的参数有时候有引用符&,有时候没有,我总结了一个便于记忆的小技巧:如果你想要对链表做出任何改变,请一定加上&;如果你对链表不想做出改变,就可以不用加,无论你加还是不加,为了保险,可以都加上。如果擅长用指针的话,就忽略从此段话!!!!!
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
#include<iostream>
#include<cstdlib>
using
namespace
std;
struct
LNode{
int
data;
LNode* next;
};
typedef LNode *LinkList;
//函数声明
void
show();
void
InitList(LinkList &L);
int
CreateList(LinkList &L,
int
n);
int
InsertList(LinkList &L,
int
index,
int
e);
string
GetElem(LinkList L,
int
index,
int
&e);
int
deleteList(LinkList &L,
int
index,
int
&e);
void
PrintList(LinkList L);
int
main(){
int
action,length,index,result,e;
string
res;
LinkList L;
show();
while
(cin>>action){
switch
(action){
case
1:
//初始化链表
system(
"cls"
);
InitList(L);
break
;
case
2:
//建立链表
system(
"cls"
);
cout<<
"请输入链表的长度:"
<<endl;
cin>>length;
result=CreateList(L,length);
if
(!result){
cout<<
"创建链表失败!"
<<endl;
}
else
{
cout<<
"创建链表成功!"
<<endl;
}
break
;
case
3:
//向链表中插入数据
system(
"cls"
);
cout<<
"请输入想要插入的位置和插入元素的值:"
<<endl;
cin>>index>>e;
InsertList(L,index,e);
break
;
case
4:
//获取索引为index的元素值
system(
"cls"
);
cout<<
"请输入索引:"
<<endl;
cin>>index;
res=GetElem(L,index,e);
if
(res==
"yes"
){
cout<<
"第"
<<index<<
"个数是"
<<e<<endl;
}
else
{
cout<<
"未找到该索引的值"
<<endl;
}
break
;
case
5:
//删除索引为index的值
system(
"cls"
);
cout<<
"请输入想要删除的数的索引:"
<<endl;
cin>>index;
deleteList(L,index,e);
cout<<
"第"
<<index<<
"个元素已经被删除!"
<<endl;
break
;
case
6:
//打印链表
system(
"cls"
);
cout<<
"链表内容为:"
<<endl;
PrintList(L);
break
;
case
7:
//退出
return
0;
}
system(
"pause"
);
//暂停
system(
"cls"
);
//清屏
show();
}
}
//主界面
void
show(){
cout<<
"+----------------------------------------+"
<<endl;
cout<<
"| |"
<<endl;
cout<<
"| 1->初始化链表 |"
<<endl;
cout<<
"| 2->创建链表 |"
<<endl;
cout<<
"| 3->插入结点 |"
<<endl;
cout<<
"| 4->查找结点 |"
<<endl;
cout<<
"| 5->删除节点 |"
<<endl;
cout<<
"| 6->打印链表 |"
<<endl;
cout<<
"| 7->退出 |"
<<endl;
cout<<
"| |"
<<endl;
cout<<
"+----------------------------------------+"
<<endl;
}
//初始化链表
void
InitList(LinkList &L){
L=
new
LNode;
cout<<
"链表初始化成功!"
<<endl;
}
//创建链表
//尾插法,最先进入的元素在最末尾
//int CreateList(LinkList &L,int n){
// cout<<"请依次输入结点的值:"<<endl;
// L->next=NULL;
// int i;
// for(i=0;i<n;i++){
// LinkList p=new LNode;
// cin>>p->data;
// p->next=L->next;
// L->next=p;
// }
// if(i!=n){
// return 0;//失败
// } else {
// return 1;//成功
// }
//}
//正序创建,按照输入顺序存储
int
CreateList(LinkList &L,
int
length){
cout<<
"请依次输入结点的值:"
<<endl;
LinkList p,q;
L->next=NULL;
p=L;
for
(
int
i=0,x;i<length;i++){
LinkList q=
new
LNode;
cin>>x;
q->data=x;
p->next=q;
p=p->next;
}
p->next=NULL;
return
1;
}
//获取第i个结点的值
string
GetElem(LinkList L,
int
i,
int
&e){
LinkList p;
p=L->next;
int
j=1;
while
(p&&j<i){
p=p->next;
j++;
}
if
(!p||j>i){
return
"no"
;
//未找到
}
else
{
e=p->data;
return
"yes"
;
//找到
}
}
//将值为e的结点插入到第i个位置
int
InsertList(LinkList &L,
int
i,
int
e){
LinkList p;
p=L;
int
j=0;
while
(p&&j<i-1){
p=p->next;
j++;
}
if
(!p||j>i-1){
return
0;
//失败
}
else
{
LinkList s=
new
LNode;
s->data=e;
s->next=p->next;
p->next=s;
return
1;
//成功
}
}
//删除第i个结点,并将结点的值保存到e中
int
deleteList(LinkList &L,
int
i,
int
&e){
LinkList p,q;
p=L;
int
j=0;
while
(p->next&&j<i-1){
p=p->next;
j++;
}
if
(!(p->next)&&j>i-1){
return
0;
}
q=p->next;
p->next=q->next;
e=q->data;
delete q;
//释放q结点,节约空间
return
e;
}
//打印链表
void
PrintList(LinkList L){
LinkList p;
p=L;
while
(p->next){
p=p->next;
cout<<p->data<<
" "
;
}
cout<<endl;
}
|