- CreateLinkList(int size) 创建大小为size的链表
- TravelLinkList() 遍历链表
- InsertLinkList(Node *data,int n) 将data节点插入链表第n个位置
- DeleteLinkList(int n) 删除链表第n个位置的节点
- CircleLinkList() 将单链表改造为循环链表
LinkList类用到了new/delete(构造函数用new,析构使用了delete)来初始化head节点,默认head节点是(0,null)
#include<bits/stdc++.h>
using namespace std;
typedef int datatype;
class Node{
//节点类
public:
datatype data;
Node *next;
};
class LinkList{
//链表类
public:
LinkList();
~LinkList();
void CreateLinkList(int size);
int TravelLinkList();
int InsertLinkList(Node *data,int n);
int DeleteLinkList(int n);
int CircleLinkList();
int size;
Node *head;
};
LinkList::LinkList(){
//内存管理
head=new Node;
head->data=0;
head->next=NULL;
size=0;
}
LinkList::~LinkList(){
delete head;
}
void LinkList::CreateLinkList(int size){
Node *ptemp=NULL;
Node *pnew=NULL;
this->size=size;
ptemp=this->head;
for(int i=0;i<size;++i){
pnew=new Node;
pnew->next=NULL;
cout<<"输入第"<<i+1<<"个节点值:"<<endl;
cin>>pnew->data;
ptemp->next=pnew;
ptemp=pnew;
}
cout<<"创建完成";
}
int LinkList::TravelLinkList(){
//遍历链表
Node *ptemp=this->head->next;
if(this->head==NULL){
cout<<"链表为空";
return 0;
}
while(ptemp){
cout<<ptemp->data<<"->";
ptemp=ptemp->next;
}
cout<<endl;
return 0;
}
int LinkList::InsertLinkList(Node *data, int n){
//在第i个位置插入data
Node *ptemp;
if(this->head==NULL){
cout<<"链表为空"<<endl;
return -1;
}
if(data==NULL){
cout<<"插入节点为空"<<endl;
return -1;
}
if(n<2){
//链表头插
Node *pnew=new Node;
pnew->data=data->data;
pnew->next=this->head->next;
this->head->next=pnew;
this->size++;
return 0;
}
if(n>this->size){
//链表尾插
ptemp=this->head;
while(ptemp->next!=NULL){
ptemp=ptemp->next;
}
Node *pnew=new Node;
pnew->data=data->data;
pnew->next=NULL;
ptemp->next=pnew;
this->size++;
return 0;
}
else{
//链表中间插入
ptemp=this->head;
for(int i=1;i<n;++i)
ptemp=ptemp->next;
Node *pnew =new Node;
pnew->data=data->data;
pnew->next=ptemp->next;
ptemp->next=pnew;
this->size++;
return 0;
}
}
int LinkList::DeleteLinkList(int n){
Node *ptemp;
Node *ptemp2;
if(n<2){
//删除头节点
ptemp=this->head->next;
this->head->next=ptemp->next;
free(ptemp);
this->size--;
return 0;
}
if(n==this->size){
//删除尾节点
ptemp=this->head;
for(int i=1;i<this->size;++i){
ptemp=ptemp->next;
}
ptemp2=ptemp->next;
ptemp->next=NULL;
free(ptemp2);
this->size--;
return 0;
}
else{
//删除中间节点
ptemp=this->head;
for(int i=1;i<n;++i){
ptemp=ptemp->next;
}
ptemp2=ptemp->next;
ptemp->next=ptemp2->next;
free(ptemp2);
this->size--;
return 0;
}
}
int LinkList::CircleLinkList(){
//将链表改为循环链表
Node *ptemp;
ptemp=this->head;
while(ptemp->next!=NULL){
ptemp=ptemp->next;
}
ptemp->next=this->head->next; //将链表最后一位的next指针指向第一个元素位置
return 0;
}