数据结构的C实现_双向循环链表

原创 2012年03月22日 18:25:09
//编译环境 visual studio 2008,win32 console application.

//DuLNode.c

//双向循环链表
#include <stdio.h>
#include <stdlib.h>
#define    OK 1
#define ERROR 0
typedef char elemType;//元素类型

typedef struct _DuLNode
{
elemType data;
struct _DuLNode *prior;
struct _DuLNode *Next;
}DuLNode,*DuLList;

//获取表长
int DuLNodeLength(DuLNode *L)
{
DuLNode *p=L->Next;
int length=0;
while((p!=NULL)&&(p!=L))
{
p=p->Next;
length++;
}
return length;
}

//获取第pos个位置的元素,若正确获取,返回1,否则返回0
int GetElem(DuLNode *L,int pos)
{
DuLNode *p=L->Next;
int j=1;
while((p!=L)&&j<pos)
{
p=p->Next;
++j;
}
if((p==L)||j>pos){ printf("get postion error\n");return ERROR;}
printf("位置%d处的元素是: %c\n",pos,p->data);
return OK;
}

//获取第pos个位置的元素的指针
DuLList GetElemP(DuLNode *L,int pos)
{
DuLNode *p=L;
int j;
for(j=1;j<=pos;j++)
p=p->Next;
return p;
}

//在带头结点的双向循环链表的第pos个位置前插入元素e
int ListInsert(DuLNode *L,int pos,elemType e)
{
DuLNode *p,*s;

p=GetElemP(L,pos);
if(!p)
return ERROR;//位置不对
if(!(s=(DuLNode *)malloc(sizeof(DuLNode)))) return ERROR;
s->data=e;
s->prior=p->prior;
p->prior->Next=s;
s->Next=p;
p->prior=s;
return OK;
}
//删除第pos个元素,并返回其值
int ListDelete(DuLNode *L,int pos)
{
DuLNode *p;
elemType tmp;
p=GetElemP(L,pos);
if(!p)
return ERROR;
tmp=p->data;
p->prior->Next=p->Next;
p->Next->prior=p->prior;
free(p);
printf("删除第%d个位置的元素,该元素是:%c\n",pos,tmp);
return OK;
}

//正向遍历双向循环链表
void TraverseList(DuLNode *L)
{
DuLNode *p=L->Next;
printf("正向遍历:\n");
while(p!=L)
{
printf("%c ",p->data);
p=p->Next;
}
printf("\n");
}

//逆向遍历双向循环链表
void TraverseBack(DuLNode *L)
{
DuLNode *p=L->prior;//指向尾结点
printf("逆向遍历:\n");
while(p!=L)
{
printf("%c ",p->data);
p=p->prior;
}
printf("\n");
}

main()
{
DuLNode *L=(DuLNode *)malloc(sizeof(DuLNode));
L->Next=L->prior=L;//循环链表
ListInsert(L,1,'a');
ListInsert(L,2,'b');
ListInsert(L,3,'c');
ListInsert(L,4,'d');
printf("表长为%d\n",DuLNodeLength(L));
TraverseList(L);
GetElem(L, 1);
GetElem(L, 2);
GetElem(L, 3);
ListDelete(L,2);
TraverseList(L);
TraverseBack(L);
} 


C/C++、JAVA 数据结构 :双向循环链表

循环链表 跟单向链表差不多 只不过多了个游标以及可以循环遍历 CircleList.h #ifndef _CIRCLE_LIST_ #define _CIRCLE_LIST_ typedef void...

数据结构--双向循环链表实践

  • 2017年07月18日 21:02
  • 1KB
  • 下载

C++数据结构与STL--双向循环链表(实现自定义iterator类)

双向循环链表核心代码图解: 节点类 #ifndef node_H #define node_H template class node { public: no...

【数据结构】双向循环链表实现

#include #include #include #define Elemtype int typedef struct D_linklist{ Elemtype data; struct D...

C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄

/* Filename: DoubleList.h Description: Adout the doubly circular linked list algorithm Date: Nove...

数据结构之循环双向链表java实现

package linearList; import java.util.Scanner; import sun.net.www.content.text.plain; import sun.rm...

数据结构学习之双向循环链表的基本操作(非递归实现)

【摘要】前一篇博客阐述了循环单链表,它虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是O(n)。如果希望从表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的每个结点里再增加一个指...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构的C实现_双向循环链表
举报原因:
原因补充:

(最多只允许输入30个字)