#include<iostream>
using namespace std;
typedef int Status;
typedef int ElemType;
//--------线性表的双向链表存储结构-----
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
Status InitList(DuLinkList& L)
{
//产生空的双向循环链表L
L=(DuLinkList)malloc(sizeof(DuLNode));
if(L)
{
L->next=L->prior=L;
return 1;
}
else
return -2;
}
int ListLength(DuLinkList L)
{
//初始条件:线性表L已存在
//操作结果:返回L中元素个数
int j=0;
DuLinkList p=L->next;
while(p!=L) //p没到表头
{
j++;
p=p->next;
}
return j;
}
DuLinkList GetElemP(DuLinkList L,int i)
{
DuLinkList p=L->next;
int j=0;
while(j<i&&p!=L)
{
j++;
p=p->next;
}
if(j>i)
return 0;
return p;
}
Status ListInsert(DuLinkList& L, int i,ElemType e)
{
//初始条件:线性表L已存在,1<=i<=ListLength(L)+1
//操作结果:在L中第i个元素之前插入新的数据元素e,
DuLinkList p;
DuLinkList s;
if(i<1||i>ListLength(L)+1)
return 0;
p=GetElemP(L,i);
if(!p)
return 0;
s=(DuLinkList)malloc(sizeof(DuLNode));
if(!s)
return 0;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return 1;
}
void ListTraverse(DuLinkList L,void(*visit)(ElemType))
{
// 由双链循环线性表L的头结点出发,正序对每个数据元素调用函数visit()
DuLinkList p=L->next;
while(p!=L)
{
visit(p->data);
p=p->next;
}
cout<<endl;
}
void ListTraverseBack(DuLinkList L,void(*visit)(ElemType))
{
//由双链循环线性表L的头结点出发,逆序对每个数据元素调用函数visit()
DuLinkList p=L->prior;
while(p!=L)
{
visit(p->data);
p=p->prior;
}
cout<<endl;
}
void print(ElemType c)
{
cout<<c<<" ";
}
int main()
{
DuLinkList L;
int i;
InitList(L);
for(i=1;i<=5;i++)
ListInsert(L,i,i); // 在第i个结点之前插入i
cout<<"正序输出链表:";
ListTraverse(L,print); // 这里只输出了一个换行符?
cout<<"逆序输出链表:";
ListTraverseBack(L,print); // 这里也只输出了一个换行符?
return 0;
}
双向循环链表的C语言实现
最新推荐文章于 2022-07-20 16:19:17 发布