#include<iostream>
#include<malloc.h>
#include<stdlib.h>
using namespace std;
typedef int elemtype;
typedef struct Dlnode
{//建立双向链表的结点,结点中包含data、前指针、后指针
elemtype data;//结点中存放的数据
struct Dlnode *prior;//结点的前指针
struct Dlnode *next;//结点的后指针
}Dlnode,*Linklist;//Dlnode是结构体类型,Linklist是结构体指针类型
Linklist Create()
{
int e;//存放L中的数据data
Linklist L,p,q;//L是链表的头结点,p是连在L后面的新建结点,q是尾指针
L=(Linklist)malloc(sizeof(Dlnode));
L->next=NULL;
L->prior=NULL;//初始化头结点
q=L;//q指向头结点
cout<<"请输入链表的各个结点元素的数值:";
cin>>e;
while(e!=9999)//判断e是否是9999,若不是继续输入,若是停止输入
{
p=(Linklist)malloc(sizeof(Dlnode));
p->next=NULL;
p->prior=NULL;//给新建结点分配内存空间并初始化
p->data=e;
cin>>e;
q->next=p;//q指向的结点的next指针指向p
p->prior=q;//p结点的前驱指针指向q结点
q=q->next;//将p连到链表后,q指向下一个结点
}
return L;//函数返回L链表
}
void Print(Linklist L)
{
Linklist q;//指针,用于指向链表中的某个结点
q=L->next;//q指向链表的第一个结点
while(q!=NULL)
{
cout<<q->data<<' ';//输出结点数据
q=q->next;//q指向下一个结点
}
cout<<endl;
}
Linklist Delete(Linklist L,int i)
{//删除第i个结点
Linklist q;//新建一个指针
q=L;//指针指向头结点
int j=0;//j用于计数
while((j<i)&&(q!=NULL))//j小于i并且q指针指向的结点不是空
{
q=q->next;//q指向下一个结点
j++;//计数器加一
}
q->prior->next=q->next;//q的前一个结点指向q的后一个结点
q->next->prior=q->prior;//q的后一个结点指向q的前一个结点
delete q;//释放q结点的内存
return L;//函数返回L
}
Linklist Insert(Linklist L,int i,int x)//在链表的第i个元素前插入x
{
Linklist q;//新建一个指针
q=L;//指针指向头结点
int j=0;//j用于计数
while((j<i)&&(q!=NULL))//j小于i并且q指针指向的结点不是空
{
q=q->next;//q指向下一个结点
j++;//计数器加一
}//最终q指向第i个结点
Linklist p;//新建一个结点
p=(Linklist)malloc(sizeof(Dlnode));//给结点分配内存空间
p->next=NULL;//p的后指针指向空
p->prior=NULL;//p的前指针指向空
p->data=x;//p的数据域存放的是x
p->next=q;//p的后指针指向q
q->prior->next=p;//第i-1个元素的后指针指向p
p->prior=q->prior;//p的前指针指向第i-1个元素
q->prior=p;//q的前指针指向p
return L;//函数返回链表L
}
void main()
{
Linklist L;
char choise;
cout<<"请输入双向链表的各个数值:(若输入9999则结束)"<<endl;
L=Create();
Print(L);
cout<<"字母A表示删除第i个结点"<<endl;
cout<<"字母B表示在第i个元素前插入一个新的结点,结点元素值为e"<<endl;
cout<<"请输入字母:";
cin>>choise;
cout<<endl;
switch(choise)
{
case'A':
{
int i;
cout<<"请输入i:"<<' ';
cin>>i;
L=Delete(L,i);
Print(L);
break;
}
case'B':
{
int z,e;
cout<<"请输入i和e:"<<' ';
cin>>z>>e;
L=Insert(L,z,e);
Print(L);
break;
}
}
system("pause");
}
数据结构-双向链表的建立及使用
猜你喜欢
转载自blog.csdn.net/qq_41596915/article/details/82917042
今日推荐
周排行