205LinkList
2016-05-11 00:00
716 查看
摘要: 教材:严蔚敏 数据结构; 西电高一凡 数据结构算法实现与解析。
代码均在visual studio 2013环境下运行成功。
无头节点的链表实现
注意:要严格按照后缀名新建文件。
如果按.h创建文件,后来简单重命名为.cpp文件,编译会出错。
顺序表的实现 包含6个文件:
c1.h 是预处理指令;
elemtype.h 定义Elemtype数据类型;
c2-2.h 是LinkList的数据结构;
bo-nohead.cpp 是SqList的基本操作函数(basic operations 缩写为 bo);
function.h 定义bo2-2.cpp中,链表遍历函数ListTraverse所需要的访问函数;
main.cpp 是实现、测试函数。
代码均在visual studio 2013环境下运行成功。
无头节点的链表实现
注意:要严格按照后缀名新建文件。
如果按.h创建文件,后来简单重命名为.cpp文件,编译会出错。
顺序表的实现 包含6个文件:
c1.h 是预处理指令;
elemtype.h 定义Elemtype数据类型;
c2-2.h 是LinkList的数据结构;
bo-nohead.cpp 是SqList的基本操作函数(basic operations 缩写为 bo);
function.h 定义bo2-2.cpp中,链表遍历函数ListTraverse所需要的访问函数;
main.cpp 是实现、测试函数。
[code=plain]//c1.h #include<iostream> #include<process.h> #include<malloc.h> #define OK 1 #define ERROR 0 #define INFEASIBLE -1 typedef int Status;
[code=plain]//elemtype.h typedef int ElemType;
[code=plain]//c2-2.h #ifndef C2_2_H #define C2_2_H #include"elemtype.h" struct LNode { ElemType data; LNode *next; }; typedef LNode* LinkList; void InitList(LinkList &L); void ListTraverse(LinkList L, void(*vi)(ElemType)); Status ListInsert(LinkList &L, int index, ElemType e); Status ListDelete(LinkList &L, int index, ElemType &e); bool ListEmpty(LinkList L); int ListLength(LinkList L); Status GetElem(LinkList L, int index, ElemType &e); int LocateElem(LinkList L, ElemType e); Status PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e); Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e); void ClearList(LinkList &L); void DestroyList(LinkList &L); #endif
[code=plain]//bo-nohead.cpp #include"c1.h" #include"c2-2.h" using namespace std; void InitList(LinkList &L) { L = nullptr; } void ListTraverse(LinkList L, void(*vi)(ElemType)) { int i = 0; if (L) { LinkList p = L; while (p) { vi(p->data); p = p->next; i++; if (!(i % 10)) cout << endl; } cout << endl; } } Status ListInsert(LinkList &L, int index, ElemType e) { int j = 1; LinkList p = L, s; if (index < 1) return ERROR; s = (LinkList)malloc(sizeof(LNode)); s->data = e; if (index == 1) { s->next = L; L = s; } else { while (p && j < index - 1) { p = p->next; j++; } if (!p) return ERROR; s->next = p->next; p->next = s; } return OK; } Status ListDelete(LinkList &L, int index, ElemType &e) { int j = 1; LinkList p = L, q; if (index == 1) { L = p->next; e = p->data; free(p); return OK; } else { while (p->next && j < index - 1) { p = p->next; j++; } if (!p->next || j > index - 1) return ERROR; q = p->next; p->next = q->next; e = q->data; free(q); return OK; } } bool ListEmpty(LinkList L) { if (L) return false; else return true; } int ListLength(LinkList L) { int i = 0; LinkList p = L; while (p) { i++; p = p->next; } return i; } Status GetElem(LinkList L, int index, ElemType &e) { if (index < 1) return ERROR; int j = 1; LinkList p = L; while (p && j < index) { p = p->next; j++; } if (!p) return ERROR; e = p->data; return OK; } int LocateElem(LinkList L, ElemType e) { int i = 0; LinkList p = L; while (p) { i++; if (p->data == e) return i; p = p->next; } return 0; } /* //this function is not efficient Status PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e) { int location = LocateElem(L, cur_e); if (location > 1) { GetElem(L, location - 1, pre_e); return OK; } else return ERROR; } Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e) { int location = LocateElem(L, cur_e); if (location >= 1 && location < ListLength(L)) { GetElem(L, location + 1, next_e); return OK; } else return ERROR; } */ Status PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e) { LinkList p = L, q ; while (p->next) { q = p->next; if (q->data == cur_e) { pre_e = p->data; return OK; } p = q; } return ERROR; } Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e) { if (L) { LinkList p = L; while (p->next) { if (p->data == cur_e) { next_e = p->next->data; return OK; } p = p->next; } } return ERROR; } void ClearList(LinkList &L) { LinkList p; while (L) { p = L; L = L->next; free(p); } } void DestroyList(LinkList &L) { LinkList q; while (L) { q = L->next; free(L); L = q; } }
[code=plain]//function.h #ifndef FUNCTION_CPP #define FUNCTION_CPP #include"c1.h" #include"elemtype.h" using namespace std; void print(ElemType e) { cout << e << " "; } #endif
[code=plain]//main.cpp #include "c1.h" #include "c2-2.h" #include "function.h" using namespace std; int main() { LinkList L; InitList(L); cout << "ListEmpty: " << ListEmpty(L) << endl; cout << "ListLength: " << ListLength(L) << endl; for (int i = 0; i < 100; i++) cout << ListInsert(L, i + 1, i); cout << endl; ListTraverse(L, print); cout << "ListEmpty: " << ListEmpty(L) << endl; cout << "ListLength: " << ListLength(L) << endl; cout << endl; ElemType e; ListDelete(L, 1, e); ListDelete(L, 97, e); ListTraverse(L, print); cout << endl; cout << "ListLength: " << ListLength(L) << endl; cout << "GetElem: " << GetElem(L, 98, e); cout << " e = " << e << endl; cout << "LocateElem: " << LocateElem(L, 99) << endl; cout << "PriorElem: " << PriorElem(L, 99, e); cout << " e = " << e << endl; cout << "NextElem: " << NextElem(L, 98, e); cout << " e = " << e << endl; ClearList(L); DestroyList(L); cin.get(); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- [C/C++]反转链表
- 如何写好 C main 函数
- 用PS实现纹理浮雕效果代码
- 用vbs实现cmd功能的代码
- 用双网卡实现三机互联
- C#数据结构之顺序表(SeqList)实例详解
- C#实现基于链表的内存记事本实例
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- C#模拟链表数据结构的实例解析
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#中实现判断某个类是否实现了某个接口
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- DL.DT.DD实现左右的布局简单例子第1/2页
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解