数据结构的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语言实现

XList.h如下: XList.h、如下:

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

【摘要】前一篇博客阐述了循环单链表,它虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是O(n)。如果希望从表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的每个结点里再增加一个指...

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

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

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

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

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

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

数据结构之双向循环链表(C++实现)

下午上机的时候大概地实现了链表的基本功能。写的时候也不是光是脑袋想, 就在word里面画了个粗糙的图形,边看边写。刚刚开始的时候功能可以不要 太多。把最基本的功能先实现,也就是数据定义,defau...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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