1、单向链表(头结点不含数据,不占长度),C++实现:
#include <iostream>
#include <stack>
using namespace std;
/*****定义节点****/
typedef struct node{
int value;
struct node *next;
}NODE;
class LinkList{
private:
NODE *Head;
public:
LinkList();
~LinkList();
void creatlist(NODE *Head,int n);
bool bianli(NODE *Head);
bool bianli_convert(NODE *Head);
bool getlenth(NODE *Head);
void Insert(NODE *Head,int n,int value);
void InsertHead(NODE *Head,int value);
bool Delete(NODE *Head,int n);
NODE* convert(NODE *Head); //翻转链表
};
/*****初始化头节点******/
LinkList::LinkList(){
}
/*******创建大小为n的单向链表******/
void LinkList::creatlist(NODE *Head,int n){
NODE *p = Head;
NODE *tmp;
cout<<"输入"<<n<<"个链表的vaule"<<endl;
for(int i=1;i<=n;i++){
tmp = new NODE;
cin>>tmp->value;
p->next = tmp;
tmp->next = NULL;
p = tmp;
}
}
/*******遍历链表*******/
bool LinkList::bianli(NODE *Head){
NODE *p = Head;
if(p==NULL||p->next==NULL)
return false;
cout<<"遍历:";
while(p->next!=NULL){
p = p->next;
cout<<p->value<<" ";
}
cout<<endl;
return true;
}
/*******反向遍历链表(stack实现)*******/
bool LinkList::bianli_convert(NODE *Head){
NODE *p = Head;
if(p==NULL||p->next==NULL)
return false;
cout<<"反向遍历:";
stack<NODE*>nodestack;
while(p->next!=NULL){
p = p->next;
nodestack.push(p);
}
while(!nodestack.empty()){
p = nodestack.top();
cout<<p->value<<" ";
nodestack.pop();
}
cout<<endl;
return true;
}
/*******反转链表*******/
NODE* LinkList::convert(NODE *Head){
NODE *p = Head->next;
NODE *pre = NULL;
NODE *next = NULL;
while(p->next!=NULL){
next = p->next;
p->next = pre;
pre = p;
p = next;
}
p->next = pre;
NODE* p1 = new NODE;
p1->next = p;
return p1;
}
/*********获取单向链表长度*********/
bool LinkList::getlenth(NODE *Head){
NODE *p = Head;
if(p==NULL||p->next==NULL)
return false;
int cnt = 0;
while(p->next!=NULL){
cnt++;
p = p->next;
}
cout<<"链表长度为:"<<cnt<<endl;
return true;
}
/******在第n个节点后加入新节点,其值为value******/
void LinkList::Insert(NODE *Head,int n,int value){
NODE *p = Head;
while(n!=0){
p = p->next;
n--;
}
NODE *Tmp = new NODE;
Tmp->value = value;
Tmp->next = p->next; //先后顺序不能乱
p->next =Tmp;
}
/**********头部插入节点***********/
void LinkList::InsertHead(NODE *Head,int value){
NODE *p = Head;
NODE *Tmp = new NODE;
Tmp->value = value;
Tmp->next = p->next;
p->next = Tmp;
}
/*******删除第n个节点********/
bool LinkList::Delete(NODE *Head,int n){
NODE *p = Head;
if(p==NULL||p->next==NULL)
return false;
while(n>1){
p = p->next;
n--;
}
p->next = p->next->next;
return true;
}
/******析构函数*******/
LinkList::~LinkList(){
delete Head;
}
int main()
{
int n;
LinkList L1;
NODE *node1 = new NODE;
cout<<"输入创建链表的个数"<<endl;
cin>>n;
L1.creatlist(node1,n);
L1.Insert(node1,4,66);
L1.InsertHead(node1,88);
L1.Delete(node1,2);
L1.bianli(node1);
L1.bianli_convert(node1);
L1.getlenth(node1);
NODE *node2 = new NODE;
node2 = L1.convert(node1);
L1.getlenth(node2);
L1.bianli(node2);
return 0;
}
测试:
2、双向循环列表代码:
#include <iostream>
#include <stack>
using namespace std;
/*****定义节点****/
typedef struct node{
int value;
struct node *next;
struct node *pre;
}NODE;
class LinkList{
private:
NODE *Head;
public:
LinkList();
~LinkList();
void creatlist(NODE *Head,int n);
bool bianli(NODE *Head);
bool getlenth(NODE *Head);
void Insert(NODE *Head,int n,int value);
bool Delete(NODE *Head,int n);
};
/*****初始化头节点******/
LinkList::LinkList(){
}
/*******创建大小为n的双向循环链表******/
void LinkList::creatlist(NODE *Head,int n){
NODE *p = Head;
NODE *tmp;
cout<<"输入"<<n<<"个链表的vaule"<<endl;
for(int i=1;i<=n;i++){
tmp = new NODE;
cin>>tmp->value;
p->next = tmp;
Head->pre = tmp;
tmp->pre = p;
tmp->next = Head;
p = tmp;
}
}
/*******遍历双向循环链表*******/
bool LinkList::bianli(NODE *Head){
NODE *p = Head;
if(p==NULL||p->next==Head)
return false;
cout<<"遍历:";
while(p->next!=Head){
p = p->next;
cout<<p->value<<" ";
}
cout<<endl;
return true;
}
/*********获取双向循环链表长度*********/
bool LinkList::getlenth(NODE *Head){
NODE *p = Head;
if(p==NULL||p->next==Head)
return false;
int cnt = 0;
while(p->next!=Head){
cnt++;
p = p->next;
}
cout<<"链表长度为:"<<cnt<<endl;
return true;
}
/******在第n个节点后加入新节点,其值为value******/
void LinkList::Insert(NODE *Head,int n,int value){
NODE *p = Head;
while(n!=0){
p = p->next;
n--;
}
NODE *Tmp = new NODE;
Tmp->value = value;
Tmp->next = p->next; //先后顺序不能乱
p->next->pre = Tmp;
Tmp->pre = p;
p->next =Tmp;
}
/*******删除第n个节点********/
bool LinkList::Delete(NODE *Head,int n){
NODE *p = Head;
if(p==NULL||p->next==Head)
return false;
while(n>1){
p = p->next;
n--;
}
p->next = p->next->next;
p->next->next->pre = p;
return true;
}
/******析构函数*******/
LinkList::~LinkList(){
delete Head;
}
int main()
{
int n;
LinkList L1;
NODE *node1 = new NODE;
cout<<"输入创建双向循环链表的个数"<<endl;
cin>>n;
L1.creatlist(node1,n);
L1.Insert(node1,2,66);
L1.Delete(node1,1);
L1.bianli(node1);
L1.getlenth(node1);
return 0;
}
测试: