双链表:
结点有两个指针:指向前驱的prior 指针, 指向后继的next指针
代码实现:
#include<iostream>
using namespace std ;
typedef int datatype;
typedef struct note
{
datatype data;
struct note *next;
struct note * prior;
}Dlink;
/***************************************************************************************/
Dlink *creat_Dlink(); /* 建立一个双链表 */
int print_Dlink(Dlink *head) ; /* 输出双链表 参数输入1为正向输出,或者是反向输出 */
int get_Len(Dlink *head) ; /* 求表长 */
int get_data(Dlink * head, int i) ; /* 取元素操作 */
int locate_data(Dlink *head,datatype e) ; /* 定位操作 */
int delete_data(Dlink *head,int i) ; /*删除操作 */
int insert_data(Dlink *head,int i,datatype data) ; /*插入一个元素 */
/**************************************************************************************/
Dlink *creat_Dlink() /* 建立一个双链表 */
{
Dlink *head,*s,*p;
p=head=new Dlink; //头结点 p 为零时结点
head->next=NULL;
head->prior=NULL;
datatype data; //数据结点
cout<<"创建一个双向链表,请输入数据 默认是int ,以-1 结束"<<endl ;
while(cin>>data&& data!=-1)
{
s = new Dlink;
s->data=data;
s->prior=p;
p->next=s;
p=s;
}
p->next=NULL;
/* 如果将双链表,转换成双向循环链表 ,可以将下面代码注释去掉 */
/* p->next=head;
head->prior=p;
*/
return (head);
}
int print_Dlink(Dlink *head,int i) /* 输出双链表 参数输入1为正向输出,或者是反向输出 */
{
Dlink *p;
p=head;
if (head->next ==NULL){
cout<<"空链表"<<endl ;
return 0 ;
}
if(i==1) // 正向输出
{
while(p->next)
{
p=p->next;
cout<<p->data<<" ";
}
cout<<endl;
}
else //反向输出,先将指针移动到最后,然后利用prior 每次向前移动
{
while(p->next){ // 将指针移动到链表尾
p=p->next;
}
while(p!=head){
cout<<p->data<<" ";
p=p->prior;
}
cout<<endl;
}
return (1);
}
int get_Len(Dlink *head) /* 求表长 */
{
Dlink *p;
int i=0;
p=head->next;
while(p)
{
i++;
p=p->next;
}
return (i);
}
int get_data(Dlink * head, int i) /* 取i位置 元素操作 */
{
int j;
Dlink *p;
int len =get_Len(head) ;
if(i<1 || i> len){
cout<<"获取元素失败 ,你输入的位置有误"<<endl ;
return (0);
}
p=head->next;
j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(p==NULL){
return 0;
}
return p->data;
}
int locate_data(Dlink *head,datatype e) /* 定位操作 */
{
Dlink *p;
int i=1;
p=head->next;
while(p&&p->data!=e) //在链表中匹配与 e 相等的值
{
p=p->next;
i++;
}
if(p==NULL) //到最后都没找打这个值
{
cout<<"链表中没有这个值 "<<endl;
return (0) ;
}
return (i);
}
int delete_data(Dlink *head,int i) /*删除i位置元素操作 e ,返回删除位置元素*/
{
Dlink *p,*s;
datatype e ;
int j;
int len =get_Len(head) ;
if(i<1 || i>len )
{
cout<<"你输入的位置有误"<<endl;
return (0);
}
p=head;
j=0;
while(p->next&&j<i-1) //将链表移动到i-1 位置
{
p=p->next;
j++;
}
if(p->next==NULL)
{
cout<<"你输入的位置超过表长"<<endl;
return (0);
}
s=p->next;
p->next=s->next;
if(s->next!=NULL){
s->next->prior=p;
}
e=s->data;
delete s;
return e ;
}
int insert_data(Dlink *head,int i,datatype data) /*在i位置插入一个元素data */
{
Dlink *p,*s;
int j;
int len =get_Len(head) ;
if(i<1|| i>len)
{
cout<<"你输入的位置有误:"<<endl;
return (0);
}
p=head;
j=0;
while(p&&j<i-1) //移动到i -1 位置
{
p=p->next;
j++;
}
if(p==NULL)
{
cout<<"你输入的位置太大,超出链表的长度:"<<endl;
return (0);
}
s=new Dlink;
s->data=data;
s->next=p->next;
s->prior=p;
if(p->next!=NULL){
p->next->prior=s;
}
p->next=s;
return (1);
}
int main()
{
Dlink *s,t;
s=&t;
s=creat_Dlink();//创建一个双向链表
cout<<"反向输出!"<<endl ;
print_Dlink(s,0);
cout<<"正向输出!"<<endl ;
print_Dlink(s,1);
cout<<"求链表长度"<<endl ;
cout<<get_Len(s)<<endl ;
cout<<"获取 4位置的元素"<<endl ;
cout<<get_data(s,4)<<endl ;
cout<<"定位元素操作 3在链表中的位置"<<endl ;
cout<<locate_data(s,3)<<endl ;
cout<<"删除1位置元素"<<endl ;
delete_data(s,1) ;
print_Dlink(s,1);
cout<<"插入操作"<<endl ;
insert_data(s,3,3);
print_Dlink(s,1);
}