// 双向链表.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
using namespace std;
//---------线性表的双向链表存储结构------------
typedef struct DuLNode{
int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList; //用DuLNode定义的变量都是结构体变量
//用DuLinkList定义的变量都是结构体指针变量
int InitList(DuLinkList *L) //双向链表的初始化
{
//产生空的双向循环链表L
*L=(DuLinkList)malloc(sizeof(DuLNode));
if(*L)
{
(*L)->next = (*L)->prior =*L;
return true;
}
else
return false;
}
int ListLength(DuLinkList L)
{
//初始条件:L已存在。操作结果:返回L中数据元素个数
int i=0;
DuLinkList p=L->next;//p指向第一个结点
while(p!=L) //p没到表头
{
i++;
p=p->next;
}
return i;
}
DuLinkList GetElemP(DuLinkList L,int i)
{
//在双向链表L中返回第i个元素的位置指针
int j;
DuLinkList p=L;
for(j=1;j<=i;j++)
p=p->next;
return p;
}
int ListInsert(DuLinkList L,int i,int e)
{
//在带头结点的双链循环线性表L中第i个位置之前插入元素e
DuLinkList p,s;
if(i<1 || i>ListLength(L)+1) //i值不合法
return false;
p=GetElemP(L,i-1);//在L中确定第i-1个元素的位置指针p
if(!p) //p=NULL,即第i-1个元素不存在
return false;
s=(DuLinkList)malloc(sizeof(DuLNode));
if(!s)
exit(-1);
s->data=e; //在地i-1个元素之后插入
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
return true;
}
int ListDelete(DuLinkList L,int i,int *e)
{
//删除带头结点的双链循环线性表L的第i个元素,i的合法值为1<=i<=表长+1
DuLinkList p;
if(i<1 || i>ListLength(L)) //i值不合法
return false;
p=GetElemP(L,i);//在L中确定第i个元素的位置指针p
if(!p) //p=NULL,即第i个元素不存在
return false;
*e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return true;
}
int main(int argc, char* argv[])
{
DuLinkList DuL,p;
InitList(&DuL);
int e,ta,num,ch[200],k;
cout<<"请输入元素的个数"<<endl;
cin>>num;
for(int i=1;i<=num;i++)
{
cin>>ch[i];
ListInsert(DuL,i,ch[i]);
}
cout<<ListLength(DuL)<<endl;
cout<<"输出链表中各个元素"<<endl;
for(int j=1;j<=num;j++)
{
p=GetElemP(DuL,j);
cout<<p->data<<endl;
}
cout<<"请输入你要删除的第i个元素"<<endl;
cin>>k;
ListDelete(DuL,k,&e);
cout<<"你要删除的第"<<k<<"个元素为"<<e<<endl;
cout<<"删除元素"<<e<<"后的链表元素为"<<endl;
for(int g=1;g<num;g++)
{
p=GetElemP(DuL,g);
cout<<p->data<<endl;
}
return 0;
}