数据结构示例之带头节点的双向循环链表
2016-10-30 13:26
871 查看
以下为“带头节点的双向循环链表”的简单实现:
1. 用c语言实现的版本
运行结果如下图所示:
1. 用c语言实现的版本
#include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<math.h> /* floor(),ceil(),abs() */ #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType; typedef struct DuLNode { ElemType data; struct DuLNode *prior, *next; }DuLNode, *DuLinkList; /* 产生空的、带头结点的、双向链表L */ Status InitList(DuLinkList *L) { *L = (DuLinkList)malloc(sizeof(DuLNode)); if (*L) { (*L)->next = (*L)->prior = *L; return OK; } else { return OVERFLOW; } } /* 将带头结点的、双向循环链表L重置为空表 */ Status ClearList(DuLinkList L) /* 不改变L */ { DuLinkList q, p = L->next; /* p指向第一个结点 */ while (p != L) /* p没到表头 */ { q = p->next; free(p); p = q; } L->next = L->prior = L; /* 头结点的两个指针域均指向自身 */ return OK; } /* 返回带头结点的、双向链表L中数据元素个数 */ int ListLength(DuLinkList L) { int i = 0; DuLinkList p = L->next; /* p指向第一个结点 */ while (p != L) /* p没到表头 */ { ++i; p = p->next; } return i; } /* 在带头结点的、双向链表L中返回第i个元素的位置指针 */ DuLinkList GetElemP(DuLinkList L, int i) { int j; DuLinkList p = L; for (j = 1; j <= i; ++j) { p = p->next; } return p; } /* 在带头结点的、双链循环线性表L中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1 */ Status ListInsert(DuLinkList L, int i, ElemType e) { DuLinkList p, s; if (i<1 || i>ListLength(L) + 1) /* i值不合法 */ { return ERROR; } p = GetElemP(L, i - 1); /* 在L中确定第i-1个元素的位置指针p */ if (!p) /* p=NULL,即第i-1个元素不存在 */ { return ERROR; } s = (DuLinkList)malloc(sizeof(DuLNode)); //申请新结点的内存 if (!s) { return OVERFLOW; } s->data = e; /* 在第i-1个元素之后插入 */ s->prior = p; s->next = p->next; p->next->prior = s; p->next = s; return OK; } /* 若带头节点的、双向循环链表L为空表,则返回TRUE,否则返回FALSE */ Status ListEmpty(DuLinkList L) { if (L->next == L && L->prior == L) { return TRUE; } else { return FALSE; } } /* ListTraverse()调用的函数(类型一致) */ void vd(ElemType c) { printf("%d ", c); } void main() { DuLinkList L; int i, n = 2; ElemType e; InitList(&L); /* 产生空的、带头节点的、双向循环链表L */ printf("初始化链表,依次输入1,2,3,4,5\n"); for (i = 1; i <= 5; ++i) { ListInsert(L, i, i); /* 在第i个结点之前插入i */ } if (ListEmpty(L)) { printf("清空前:链表为空.\n"); } else { printf("清空前:链表非空,长度为%d.\n",ListLength(L)); } ClearList(L); /* 清空链表 */ if (ListEmpty(L)) { printf("清空后:链表为空.\n"); } else { printf("清空后:链表非空,长度为%d.\n", ListLength(L)); } }
运行结果如下图所示:
相关文章推荐
- 数据结构示例之带头节点的双向循环链表
- 数据结构示例之带头节点的、单循环链表
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 双向循环带头节点链表
- 双向循环链表的建立,插入,删除(带头节点)
- 带头节点的双向循环链表的增删查改
- 数据结构之双向带头节点带环链表的实现
- 不带头节点的双向循环链表的基本操作
- 【C++】模板实现带头节点的双向循环链表
- 数据结构:带头结点的双向循环链表
- 带头节点带环的双向循环链表
- 如何创建不带头节点的双向循环链表
- C++实现数据结构三 双向循环链表
- 双向循环链表的建立,插入,删除(不带头结点)
- 数据结构(二)——单链表 、带头结点的单链表、循环链表 及其实现
- 判断带头结点的双向循环链表L是否对称相等的算法
- C/C++、JAVA 数据结构 :双向循环链表
- (8) Java源码分析 ---- LinkedList (对应数据结构中线性表中的双向循环链表,JDK1.6)
- 数据结构学习之双向循环链表的基本操作(非递归实现)
- 数据结构双向循环链表的C语言实现(插入,查询,删除)