线性表链式存储结构实现 --双向循环链表
2015-12-29 02:00
369 查看
#ifndef _DOUBLE_LINKLIST_H_ #define _DOUBLE_LINKLIST_H_ /************************************************************************/ /* 线性表链式存储结构实现 --双向循环链表 */ /************************************************************************/ typedef struct DLinkNode { ElemType data; DLinkNode* Prior; DLinkNode* Next; }DLinkNode; //双向循环链表 typedef DLinkNode* DoubleLinkList; /**初始化操作,建立一个空的线性表L。*/ Status InitList(DoubleLinkList* L); /**采用头插法初始化链表,建立一个包含n个元素的线性表L。*/ Status CreateListHead(DoubleLinkList* L , int n); /**采用尾插法初始化链表,建立一个包含n个元素的线性表L。*/ Status CreateListTail(DoubleLinkList* L , int n); /**若线性表为空,返回true,否则返回false*/ bool ListEmpty(DoubleLinkList L); /**将线性表清空*/ Status ClearList(DoubleLinkList* L); /**将线性表中第i个位置元素值返回给e*/ Status GetElem(DoubleLinkList L,int i,ElemType* e); /**在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败*/ int LocateElem(DoubleLinkList L ,ElemType e); /**在线性表中的第i个位置插入元素e*/ Status ListInsert(DoubleLinkList*L,int i,ElemType e); /**删除线性表中第i个位置的元素,并返回这个位置的元素值e*/ Status ListDelete(DoubleLinkList*L,int i,ElemType* e); /**返回线性表L的元素个数*/ int ListLength(DoubleLinkList L); /**遍历链表元素*/ Status TraverseList(DoubleLinkList L); #endif//_DOUBLE_LINKLIST_H_
#include "stdafx.h" #include "DoubleLinkList.h" /**初始化操作,建立一个空的线性表L。*/ Status InitList(DoubleLinkList* L) { DoubleLinkList list = (DoubleLinkList)malloc(sizeof(DLinkNode)); list->Next = list; list->Prior = list; *L = list; return OK; } /**采用头插法初始化链表,建立一个包含n个元素的线性表L。*/ Status CreateListHead(DoubleLinkList* L , int n) { InitList(L); for (int i = 0 ; i < n ; i++) { DoubleLinkList pNewNode = (DoubleLinkList)(malloc(sizeof(DLinkNode))); pNewNode->data = i; pNewNode->Next = (*L)->Next; pNewNode->Prior = (*L); (*L)->Next = pNewNode; if(i == 0) (*L)->Prior = pNewNode; } return OK; } /**采用尾插法初始化链表,建立一个包含n个元素的线性表L。*/ Status CreateListTail(DoubleLinkList* L , int n) { InitList(L); DoubleLinkList pCurrentNode = (*L)->Next; for (int i = 0 ; i < n ; i++) { DoubleLinkList pNewNode = (DoubleLinkList)(malloc(sizeof(DLinkNode))); pNewNode->data = i; pNewNode->Prior = pCurrentNode; pNewNode->Next = *L; (*L)->Prior = pNewNode; pCurrentNode->Next = pNewNode; pCurrentNode = pNewNode; } return OK; } /**若线性表为空,返回true,否则返回false*/ bool ListEmpty(DoubleLinkList L) { return L == L->Next && L == L->Prior; } /**将线性表清空*/ Status ClearList(DoubleLinkList* L) { if(ListEmpty(*L)) return OK; DoubleLinkList pNode = (*L)->Next; int index = 0 ; while(pNode != *L) { DoubleLinkList pDelNode = pNode; pNode = pDelNode->Next; free(pDelNode); } return OK; } /**将线性表中第i个位置元素值返回给e*/ Status GetElem(DoubleLinkList L,int i,ElemType* e) { if(ListEmpty(L)) return ERROR; DoubleLinkList pNode = L->Next; int index = 0 ; while(pNode != L) { if(index == i) { *e = pNode->data; break; } index++; pNode = pNode->Next; } return i == index ? OK:ERROR; } /**在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败*/ int LocateElem(DoubleLinkList L ,ElemType e) { if(ListEmpty(L)) return ERROR; DoubleLinkList pNode = L->Next; int index = 0 ; while(pNode != L) { if(pNode->data == e) break; index++; pNode = pNode->Next; } return pNode == L ? -1:index; } /**在线性表中的第i个位置插入元素e*/ Status ListInsert(DoubleLinkList*L,int i,ElemType e) { DoubleLinkList pNode = (*L)->Next; int index = 0 ; while(pNode != (*L)) { if(i == 0 || index == i-1) break; index++; pNode = pNode->Next; } if (i !=0 && index != i-1) return ERROR; DoubleLinkList pNewNode = (DoubleLinkList)malloc(sizeof(DLinkNode)); pNewNode->data = e; pNewNode->Next = pNode->Next; pNewNode->Prior = pNode; pNode->Next->Prior = pNewNode; pNode->Next = pNewNode; return OK; } /**删除线性表中第i个位置的元素,并返回这个位置的元素值e*/ Status ListDelete(DoubleLinkList*L,int i,ElemType* e) { if (ListEmpty(*L)) return ERROR; DoubleLinkList pNode = (*L)->Next; int index = 0 ; while(pNode != (*L)) { if(i == 0 || index == i) break; index++; pNode = pNode->Next; } if (i !=0 && index != i) return ERROR; pNode->Prior->Next = pNode->Next; pNode->Next->Prior = pNode->Prior; free(pNode); return OK; } /**返回线性表L的元素个数*/ int ListLength(DoubleLinkList L) { DoubleLinkList pNode = L->Next; int index = 0 ; while(pNode != L) { index++; pNode = pNode->Next; } return index; } /**遍历链表元素*/ Status TraverseList(DoubleLinkList L) { DoubleLinkList pNode = L->Next; int i = 0; while(pNode != L) { std::cout<<"第"<<i++<<"个元素为:"<<pNode->data<<std::endl; pNode = pNode->Next; } return OK; }
相关文章推荐
- 归并排序
- STL vector用法介绍
- 线性表链式存储结构实现 --单向循环链表
- IntelliJ IDEA+Tomcat+Nginx运行git项目
- poj-3579 Median
- JSP实现HTML网页对Mysql数据库的数据修改
- 生产者消费者问题【线程中ConcurrentLinkedQueue】
- 线性表链式存储结构实现--静态链表
- [LeetCode] 45. Jump Game II 解题思路
- 线性表链式存储结构实现 --单链表
- Burndown chart
- Git下使用版本回退粗暴解决冲突问题
- linux下网卡配置管理工具ifconfig小结
- php生成网页桌面快捷方式
- JSP实现HTML网页中分页查询Mysql数据库数据
- ubuntu和win7引导修复
- ThinkPHP+JQuery实现ajax无刷新登录验证(详解+相关问题)
- PL/SQL 64位发布啦!!!
- No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse
- AndroidManifest.xml file missing!