C++ 有头节点链表的基本操作
#include <iostream>
using namespace std
;
typedef struct node
{
int num
;
node
* next
;
}Node
;
class list{
Node
* head
;
static int size
;
public:
list(){
cout
<<"构造函数的调用..."<<endl
;
head
= new Node
;
head
->num
= 0;
head
->next
= NULL;
}
~list(){
cout
<<"析构函数的调用..."<<endl
;
delete head
;
}
void createList(){
Node
* p
= head
;
for (int i
= 1; i
< 10; i
++) {
Node
* pNew
= new Node
;
pNew
->num
= i
;
pNew
->next
= NULL;
p
->next
= pNew
;
p
= pNew
;
size
++;
}
}
void insertHeadNode(int n
){
Node
* p
= head
;
Node
* pnew
= new Node
;
pnew
->num
= n
;
if(p
== NULL){
p
->next
= pnew
;
pnew
->next
= NULL;
}
else{
pnew
->next
= p
->next
;
p
->next
= pnew
;
size
++;
}
}
void inserEndtNode(int n
){
Node
* p
= head
;
Node
* pnew
= new Node
;
pnew
->num
= n
;
pnew
->next
= NULL;
if(p
== NULL){
p
= pnew
;
}
else{
while(p
->next
){
p
= p
->next
;
}
p
->next
= pnew
;
size
++;
}
}
void insertNode(int n
,int add
){
Node
* p
= head
;
Node
* pnew
= new Node
;
pnew
->num
= n
;
if(p
== NULL){
p
= pnew
;
pnew
->next
= NULL;
}
else{
if(add
<1 || add
>size
){
cout
<<"插入的位置有误!"<<endl
;
}
else{
int i
= 1;
while(i
< add
){
p
= p
->next
;
i
++;
}
pnew
->next
= p
->next
;
p
->next
= pnew
;
size
++;
}
}
}
void modNode(int old
,int xin
){
Node
* p
= head
;
if(p
== NULL){
cout
<<"链表为空!!"<<endl
;
}
else{
while(p
->next
){
p
= p
->next
;
if(p
->num
== old
){
p
->num
= xin
;
}
}
}
}
int findNode(int n
){
Node
* p
= head
;
int add
=0;
while(p
->num
!= n
){
p
= p
->next
;
add
++;
}
return add
;
}
void delNode(int n
){
Node
* p
= head
;
if(p
== NULL){
cout
<<"链表为空!!"<<endl
;
}
else{
cout
<<"add= "<<findNode(n
)<<endl
;
for(int i
=1; i
<findNode(n
); i
++){
p
= p
->next
;
}
Node
* del
= p
->next
;
p
->next
= p
->next
->next
;
delete del
;
del
= NULL;
size
--;
}
}
void delHeadNode(){
Node
* p
= head
;
if(p
== NULL){
cout
<<"链表为空!!"<<endl
;
}
else{
Node
* del
= p
->next
;
p
->next
= p
->next
->next
;
delete del
;
size
--;
}
}
void delEndNode(){
Node
* p
= head
;
Node
* temp
= NULL;
if(p
== NULL){
cout
<<"链表为空!!"<<endl
;
}
else{
while(p
->next
){
temp
= p
;
p
= p
->next
;
}
delete p
;
p
= NULL;
temp
->next
= NULL;
size
--;
}
}
void listlength(){
Node
* p
= head
;
int len
=0;
while(p
->next
){
p
= p
->next
;
len
++;
}
cout
<<"链表的长度是:"<<len
<<endl
;
}
void sortList(){
Node
* p
= head
;
if(p
== NULL){
cout
<<"链表为空!!无法排序"<<endl
;
}
else{
cout
<<"给链表元素排序"<<endl
;
int len
=0;
while(p
){
len
++;
p
= p
->next
;
}
for(int i
=0; i
<len
-1; i
++){
Node
* ph1
= p
->next
;
Node
* ph2
= ph1
->next
;
for(int j
=0; j
<len
-i
-1; j
++){
if(ph1
->num
< ph2
->num
){
p
->next
= ph2
;
ph1
->next
= ph2
->next
;
ph2
->next
= ph1
;
Node
* temp
= ph1
;
ph1
= ph2
;
ph2
= temp
;
}
p
= p
->next
;
ph1
= ph1
->next
;
ph2
= ph2
->next
;
}
}
}
}
void sortList(){
Node
* p
= head
;
Node
* tail
= NULL;
while(p
->next
!=tail
)
{
Node
* p1
= head
;
Node
* p2
= head
->next
;
while(p2
->next
!=tail
)
{
if(p1
->next
->num
< p2
->next
->num
)
{
p1
->next
= p2
->next
;
p2
->next
= p2
->next
->next
;
p1
->next
->next
= p2
;
p1
= p1
->next
;
}
else
{
p1
= p1
->next
;
p2
= p2
->next
;
}
}
tail
= p2
;
}
}
void sortList()
{
Node
* p
= head
;
Node
* tail
= NULL;
while(p
->next
!= tail
){
Node
* pre
= head
;
Node
* pne
= head
->next
;
pre
= pre
->next
;
while(pre
->next
!= tail
){
if(pre
->num
< pre
->next
->num
){
int temp
= pre
->num
;
pre
->num
= pre
->next
->num
;
pre
->next
->num
= temp
;
}
pre
= pre
->next
;
pne
= pne
->next
;
}
tail
= pre
;
}
}
void delAllNode(){
Node
* p
= head
;
Node
* temp
= NULL;
if(p
->next
== NULL){
cout
<<"只有头结点,无法删除头结点以外的所有节点!"<<endl
;
}
else{
while(p
->next
){
temp
= p
->next
;
p
->next
= p
->next
->next
;
delete temp
;
temp
= NULL;
size
--;
}
p
->next
= NULL;
cout
<<"链表已清空"<<endl
;
}
}
void clearList(){
Node
* p
= head
;
Node
* temp
= NULL;
if(p
== NULL){
cout
<<"链表为空,无法销毁!"<<endl
;
}
else{
if(p
->next
== NULL){
delete p
;
p
= NULL;
}
else{
while(p
->next
){
temp
= p
->next
;
p
->next
= p
->next
->next
;
delete temp
;
size
--;
}
delete p
;
p
= NULL;
cout
<<"链表已销毁"<<endl
;
}
}
}
void pointList(){
Node
* p
= head
;
if(p
== NULL){
cout
<<"链表为空!!"<<endl
;
}
else{
while(p
->next
){
p
= p
->next
;
cout
<<p
->num
<<"\t";
}
cout
<<endl
;
cout
<<"链表元素个数:size= "<<size
<<endl
;
}
}
};
int list
::size
= 0;
int main(){
list s1
;
s1
.createList();
s1
.pointList();
s1
.insertHeadNode(10);
s1
.pointList();
s1
.inserEndtNode(90);
s1
.pointList();
s1
.insertNode(30,5);
s1
.pointList();
s1
.modNode(90,100);
s1
.pointList();
s1
.delHeadNode();
s1
.pointList();
s1
.delEndNode();
s1
.pointList();
s1
.delNode(30);
s1
.pointList();
s1
.listlength();
s1
.sortList();
s1
.pointList();
s1
.delAllNode();
s1
.pointList();
s1
.listDel();
s1
.pointList();
return 0;
}
以上代码有错误的地方,欢迎留言指出,互相学习进步。
转载请注明原文地址:https://ipadbbs.8miu.com/read-44814.html