⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 双向循环链表.cpp

📁 用于数据结构课程设计,双向链表,并且用了MFC做图形界面
💻 CPP
字号:
#include<iostream.h>
typedef struct DuLNode               //双向循环链表的存储结构
{ int data;
  struct DuLNode  *prior;
  struct DuLNode  *next;
}DuLNode,*DuLinkList;


int ListLocate_DuL(DuLinkList L,int x)    //在带头结点的双向循环链表L中查找与x相等的所有元素的位序
{int i,count=0; DuLinkList p;
p=L->next; i=1;                    //i的初值为第一个元素的位序
                                   //p的初值为第一个结点的位序
cout<<"请输入您想要查找的整数元素的值:"<<endl;
cin>>x;

while(p!=L&&p->data!=x)         //寻找数据域的值为x的结点
{p=p->next; i++;}
if(p==L){cout<<"Not Found!"<<endl;}  //没有找到,显示NOT FOUND
else
{for(p;p!=L;p=p->next)        //从找到的第一个满足要求的结点起,继续往后进行寻找满足要求的其他结点
if(p->data==x)
{cout<<"您要查找的元素存在!它在链表中的位置是:"<<i<<endl<<endl<<endl;
i++;count++;}
else i++;
cout<<"您查找到的满足要求的元素一共有"<<count<<"个"<<endl<<endl<<endl;
}//所有与x相等的元素都已经找到,显示其所有结点所在的链表中的位置


return L,x;
}


int ListInsert_DuL(DuLinkList &L,int i,int e)  //在带头结点的双向循环链表L中第i个位置之前插入元素e
{DuLinkList p,s;
p=L->next; int j=0;                           //P的初值得为第一个结点
                                              //j的初值为0
cout<<"请输入您想要插入的整数元素:";
cin>>e;
cout<<"请输入您想要插入的位置";
cin>>i;
while(p->next!=L&&j<i-1){p=p->next;++j;}        //寻找第i-1个结点
if(p->next==L||j>i-1)                          //i小于1或者大于表长+1
{cout<<"您插入的位置不合适,请重新输入";}
else
{s=(DuLinkList)new int(sizeof(DuLNode));          //生成新结点
 s->data=e;                                       //插入L中
 s->prior=p->prior;            
 p->prior->next=s;
 s->next=p;
 p->prior=s;
cout<<"插入完毕后,现在双向循环链表中的数据为:";  //显示插入完毕后的双向循环链表 
for(p=L->next;p!=L;p=p->next)
cout<<p->data<<"  ";}
cout<<endl<<endl<<endl;
return L,i,e;
}


int ListDelete_DuL(DuLinkList &L, int i, int e)   //在带头结点的双向循环链表中删除第i个元素,并由e返回其值
{DuLinkList p; int j=0;
p=L->next;
cout<<"请输入您想要删除的元素的位置:";
cin>>i;
while(p->next!=L&&j<i-1)                     //寻找第i个结点,并令p指向其前驱
{p=p->next; ++j;}
if(p->next==L||j>i-1)
cout<<"您输入的位置有误,请重新输入";        //删除的位置不合理
else
{e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
delete(p);                          //删除并释放结点
 cout<<"删除已经完成!现在链表中的元素为:";
for(p=L->next;p!=L;p=p->next)
cout<<p->data<<"  ";}               //显示删除完毕后的双向循环链表
cout<<endl<<endl<<endl;
return L,i,e;
}



main()             //顺位序输入10个元素,建立并显示双向循环链表
{DuLinkList L;
DuLinkList p;
DuLinkList q;
int x,e;
L=(DuLinkList)new int(sizeof(DuLNode));  //先建立一个带头结点的双向循环链表
L->next=L; L->prior=L;
p=L;
cout<<"请输入任意10个整数:"<<endl;
for(int i=0;i<10;i++)                
{q=(DuLinkList)new int(sizeof(DuLNode));   //生成10个新结点
 p->next=q;                          //插入结点                              
 q->prior=p; 
 p=q;
 cin>>q->data;                      //输入元素的值
}
p->next=L; L->prior=p;              //建立头结点后最后一个结点间的双向循环
cout<<"双向循环链表已经建立成功,现在链表中的10个整数分别为:"<<endl;
for(p=L->next;p!=L;p=p->next)
{cout<<p->data<<"  ";}
cout<<endl<<endl;
while(p->next!=L)        //P的下一个结点不为头结点L时,执行下列操作
{cout<<"请输入数字1、2、3、4选择您想要执行的操作"<<endl<<"1、查找"<<endl<<"2、插入"<<endl<<"3、删除"<<endl<<"4、不需要再执行操作,退出程序"<<endl;
 cout<<"请选择:";
 int n;
cin>>n;
if(n==1) 
ListLocate_DuL(L,x);       //对双向循环链表执行查找操作
if(n==2)
ListInsert_DuL(L,i,e);     //对双向循环链表执行插入操作
if(n==3)
ListDelete_DuL(L,i,e);     //对双向循环链表执行删除操作
if(n==4)
return 0;}                 //不再执行任何操作,退出程序
 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -