DoubleWayList 双向循环链表

作者在 2017-04-20 20:26:56 发布以下内容
//我发现,插入操作时,总是先把New与已有节点连接 

#include<iostream>
#include<cstdlib>
#define LEN sizeof(struct Node)
using namespace std;

typedef struct Node *PtrToNode;
typedef PtrToNode Position;

struct Node
{
int Element;
struct Node *Last;
struct Node *Next;
};


Position Create(void);           //创建双向循环链表 
void Traverse(Position Head);    //正序遍历/n反序遍历 
void Insert(Position Head);      //插入一个元素 
void Delete(Position Head);      //删除一个元素 
int GetListLenth(Position Head); //用于插入 

int main()  //测试 
{
Position Head;
Head=Create();
Traverse(Head);
Insert(Head);
Delete(Head);
return 0;
}


Position Create(void)  //创建 
{
int a[6]={11,41,18,49,35,66},i;
Position Head=NULL;
    Position New=NULL,Tail=NULL;
    Head=(struct Node *)malloc(LEN);
    if(Head==NULL)
        cout <<"空间不足!" <<endl ;
    Head->Next=Head;
    Head->Last=Head;
    Head->Element=0;
    Tail=Head;
    for(i=0;i<6;i++)
    {
    New=(struct Node *)malloc(LEN);
    if(New==NULL)
       cout <<"空间不足!" <<endl ;
    New->Element=a[i];     //赋值 
    New->Last=Tail;        //先把New与已有的节点连接 
    New->Next=Head;
    Tail->Next=New;        //把原来的尾节点与New连接 
    Head->Last=New;        //把Head的Last与New连接 
    Tail=New;              //现在,New是新的Tail,在末尾插入完毕 
   
}
return Head;
}


void Traverse(Position Head)  //遍历,这里的Head_L用来遍历,而不一直是头指针 
{
Position Head_L=Head->Next;  //从这开始,正序遍历总是指向Next 
while(Head_L!=Head)
{
cout <<Head_L->Element <<' ' ;
Head_L=Head_L->Next;
}
cout <<"正序遍历完毕" <<endl ;
Head_L=Head->Last;          //从这开始,反序遍历总是指向Last 
while(Head_L!=Head)
{
cout <<Head_L->Element <<' ' ;
Head_L=Head_L->Last;
}
cout <<"反序遍历完毕" <<endl ; 
}




void Insert(Position Head)   //插入
{
int X,SubLabel;
Position New=NULL;
Position Head_L=Head->Next;
cout <<"请输入你要插入的元素值:" ;
cin >>X ;
cout <<"请输入你要插到的序号:" ;
cin >>SubLabel ;

if(SubLabel>0&&SubLabel<=GetListLenth(Head))
{
while(SubLabel-1)   //找到链表要插入的位置 
       {
        Head_L=Head_L->Next;
        SubLabel--;
       }
   New=(struct Node *)malloc(LEN);
   if(New==NULL)
       cout <<"空间不足!" <<endl ;
   New->Element=X;    //赋值 
   New->Last=Head_L->Last;  //先把New与已有节点连接 
   New->Next=Head_L;
   Head_L->Last->Next=New;  //趁着还有着Head_L的上一个节点位置,及早把它与New连接 
   Head_L->Last=New;        //最后把New与Head_L连接 
   Traverse(Head);  
}
else cout <<"输入的序号有误!" <<endl ;
}


void Delete(Position Head)
{
int SubLabel;
Position Head_L=Head->Next;
cout <<"请输入要删除元素对应的序号:" ;
cin >>SubLabel ;

if(SubLabel>0&&SubLabel<=GetListLenth(Head))
{
while(SubLabel-1) //找到要删除的位置 
{
Head_L=Head_L->Next;
SubLabel--;
}
Head_L->Last->Next=Head_L->Next; //把要删除的位置Head_L的前一个位置与Head_L的下一个位置连接起来 
Head_L->Next->Last=Head_L->Last; //建议画个图,很清晰 
delete Head_L;  //释放 
Traverse(Head);
}
else cout <<"输入的序号有误!" <<endl ;
}


int GetListLenth(Position Head)  //获得元素个数,这与单链表,循环链表的想法是一样的 
{
int Lenth=0;
Position Head_L=Head->Next;
while(Head_L!=Head)
{
Lenth++;
Head_L=Head_L->Next;
}
return Lenth;
}
c++基础 | 阅读 1293 次
文章评论,共0条
游客请输入验证码