SingleCycleList单向循环链表

作者在 2017-04-17 12:55:52 发布以下内容
#include<iostream>
#include<cstdlib>
using namespace std;
#define LEN sizeof(struct Node)
#define N 6


typedef struct Node *PtrToNode;
typedef PtrToNode Position;


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


Position Create(void);  //创建一个循环链表 
void Taverse(Position Head); //遍历
void Inser(Position Head); //插入一个元素 
void Delete(Position Head); //删除一个元素 
int GetListLenth(Position Head); //获得单向循环链表元素个数,用于判断用户输入的序号 


int main()  //测试 
{
Position Head;
Head=Create();
Taverse(Head);
Inser(Head);
Delete(Head);
delete Head;
return 0;
}


Position Create(void) //创建一个单向循环链表 
{
int i,a[N]={10,20,25,59,18,11}; 

Position Head,Tail=NULL,New=NULL;
Head=(struct Node *)malloc(LEN);
if(Head==NULL)
   cout <<"空间不足创建失败!" <<endl ;
Tail=Head;
Head->Element=0;
Head->Next=Head;  //循环链表,当只有一个元素时,它总是指向自己 
for(i=0;i<N;i++)
{
New=(struct Node *)malloc(LEN);
if(New==NULL)
   cout <<"空间不足!" <<endl ;
New->Element=a[i];
New->Next=Head;  //最新的New是末尾,所以指向头 
Tail->Next=New;  //所以现在Tail不是末尾,而Tail的Next New才是末尾 
Tail=New;        //让New成为新的末尾 
}
return Head; 
}




void Taverse(Position Head)
{
Position Head_L=Head->Next;
while(Head_L!=Head)
{
cout <<Head_L->Element <<' ';
Head_L=Head_L->Next; 
}
cout <<"\n遍历完毕!\n" ;
}


void Inser(Position Head)  //插入一个元素 
{
int X,SubLabel;
cout <<"请输入要插入的元素:";
cin >>X ;
cout <<"请输入要插到的序号:";
cin >>SubLabel ;
if(SubLabel>0&&SubLabel<=GetListLenth(Head))
{
Position Head_L=Head->Next;
Position New=(struct Node *)malloc(LEN);  //开辟内存 
if(New==NULL)
   cout <<"内存不足!插入失败\n" ; 
while(SubLabel-2)    //寻找要插入的位置的前一个元素的地址 
{
SubLabel--;
Head_L=Head_L->Next;
}
New->Element=X;  //赋值 
New->Next=Head_L->Next;  //把New的下一个元素与要插入的位置对应的元素连接起来 
Head_L->Next=New;        //把New与要插入的位置的前一个元素连接起来,这样就实现了插入 
cout <<"插入后:" ;  
Taverse(Head);
}
else cout <<"输入的下标有误!\n" ; 
}


void Delete(Position Head) //删除一个元素 
{
int SubLabel;
cout <<"请输入你要删除的序号:" ;
cin >>SubLabel ;
if(SubLabel>0&&SubLabel<=GetListLenth(Head))
{
Position Head_L=Head->Next;
Position Deletion=NULL;
while(SubLabel-2)  //寻找要插入的位置的前一个元素的地址 
{
SubLabel--;
Head_L=Head_L->Next;
}
Deletion=Head_L->Next;  //让要删除的元素与序号前一个元素连接起来 
Head_L->Next=Deletion->Next; //让序号前一个元素与deletion的下一个元素连接起来,这样就实现了删除 
delete Deletion;  //delete释放空间 
cout <<"删除后:" ;
Taverse(Head);
}
else cout <<"输入的序号有误!\n" ;
}


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++基础 | 阅读 1335 次
文章评论,共0条
游客请输入验证码