算法学习 - 链表的游标实现~ C++
2014-07-27 17:42
549 查看
链表的游标实现,就是用另外一种方法来访问链表,模拟游标。
在我学习的理解中,就是创建一个节点数组,模拟内存的排列,然后从其中来申请内存和释放内存。但是实际的内存没有被释放~
下面直接贴代码了:
//
// main.cpp
// CursorList
//
// Created by Alps on 14-7-27.
// Copyright (c) 2014年 chen. All rights reserved.
//
#include <iostream>
#define CursorSpace 100
#define ElementType int
using namespace std;
typedef int PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
void InitializeCursorList(void);
List MakeEmpty(List L);
int isEmpty(List L);
int isLast(List L, Position P);
void Insert(List L, Position P, ElementType X);
void Delete(List L, ElementType X);
Position Find(List L, ElementType X);
Position FindPrevious(List L, ElementType X);
void DeleteList(List L);
struct Node{
ElementType X;
Position Next;
};
struct Node CursorList[CursorSpace];
int isEmpty(List L){
return CursorList[L].Next == 0;
}
int isLast(List L, Position P){
return CursorList[P].Next == 0;
}
void InitializeCursorList(void){
int i = 0;
for (i = 0; i < CursorSpace; i++) {
CursorList[i].Next = i + 1;
}
CursorList[CursorSpace - 1].Next = 0;
}
Position CursorAlloc(){
Position P;
P = CursorList[0].Next;
CursorList[0].Next = CursorList[P].Next;
CursorList[P].Next = 0;
return P;
}
void CursorFree(Position P){
CursorList[P].Next = CursorList[0].Next;
CursorList[0].Next = P;
}
Position Find(List L, ElementType X){
Position P = CursorList[L].Next;
while (CursorList[P].X != X && P) {
P = CursorList[P].Next;
}
if (P == 0) {
return false;
}
return P;
}
Position FindPrevious(List L, ElementType X){
Position P = L;
Position tmp = CursorList[P].Next;
while (CursorList[tmp].X != X && tmp) {
tmp = CursorList[tmp].Next;
P = CursorList[P].Next;
}
return P;
}
void Delete(List L, ElementType X){
Position P = FindPrevious(L, X);
Position tmp = CursorList[P].Next;
CursorList[P].Next = CursorList[tmp].Next;
}
void Insert(List L, Position P, ElementType X){
Position tmp;
tmp = CursorAlloc();
CursorList[tmp].X = X;
CursorList[tmp].Next = CursorList[P].Next;
CursorList[P].Next = tmp;
}
void DeleteList(List L){
Position P = CursorList[L].Next;
Position tmp = P;
while (tmp != 0) {
P = CursorList[P].Next;
CursorFree(tmp);
if (P == 0) {
break;
}
tmp = P;
}
CursorList[L].Next = 0;
}
void Print(List L){
Position P = CursorList[L].Next;
while (P != 0) {
printf("%d ",CursorList[P].X);
P = CursorList[P].Next;
}
printf("\n");
}
int main(int argc, const char * argv[])
{
printf("start ...\n");
InitializeCursorList();
List L = CursorAlloc();
Insert(L, L, 1);
Insert(L, L, 3);
Insert(L, L, 5);
Insert(L, L, 4);
Print(L);
Position P = FindPrevious(L, 3);
printf("%d\n",P);
Delete(L, 3);
Print(L);
DeleteList(L);
Print(L);
return 0;
}
算法是没有问题的,我写完之后测试了每个函数~
有什么问题请留言~
在我学习的理解中,就是创建一个节点数组,模拟内存的排列,然后从其中来申请内存和释放内存。但是实际的内存没有被释放~
下面直接贴代码了:
//
// main.cpp
// CursorList
//
// Created by Alps on 14-7-27.
// Copyright (c) 2014年 chen. All rights reserved.
//
#include <iostream>
#define CursorSpace 100
#define ElementType int
using namespace std;
typedef int PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
void InitializeCursorList(void);
List MakeEmpty(List L);
int isEmpty(List L);
int isLast(List L, Position P);
void Insert(List L, Position P, ElementType X);
void Delete(List L, ElementType X);
Position Find(List L, ElementType X);
Position FindPrevious(List L, ElementType X);
void DeleteList(List L);
struct Node{
ElementType X;
Position Next;
};
struct Node CursorList[CursorSpace];
int isEmpty(List L){
return CursorList[L].Next == 0;
}
int isLast(List L, Position P){
return CursorList[P].Next == 0;
}
void InitializeCursorList(void){
int i = 0;
for (i = 0; i < CursorSpace; i++) {
CursorList[i].Next = i + 1;
}
CursorList[CursorSpace - 1].Next = 0;
}
Position CursorAlloc(){
Position P;
P = CursorList[0].Next;
CursorList[0].Next = CursorList[P].Next;
CursorList[P].Next = 0;
return P;
}
void CursorFree(Position P){
CursorList[P].Next = CursorList[0].Next;
CursorList[0].Next = P;
}
Position Find(List L, ElementType X){
Position P = CursorList[L].Next;
while (CursorList[P].X != X && P) {
P = CursorList[P].Next;
}
if (P == 0) {
return false;
}
return P;
}
Position FindPrevious(List L, ElementType X){
Position P = L;
Position tmp = CursorList[P].Next;
while (CursorList[tmp].X != X && tmp) {
tmp = CursorList[tmp].Next;
P = CursorList[P].Next;
}
return P;
}
void Delete(List L, ElementType X){
Position P = FindPrevious(L, X);
Position tmp = CursorList[P].Next;
CursorList[P].Next = CursorList[tmp].Next;
}
void Insert(List L, Position P, ElementType X){
Position tmp;
tmp = CursorAlloc();
CursorList[tmp].X = X;
CursorList[tmp].Next = CursorList[P].Next;
CursorList[P].Next = tmp;
}
void DeleteList(List L){
Position P = CursorList[L].Next;
Position tmp = P;
while (tmp != 0) {
P = CursorList[P].Next;
CursorFree(tmp);
if (P == 0) {
break;
}
tmp = P;
}
CursorList[L].Next = 0;
}
void Print(List L){
Position P = CursorList[L].Next;
while (P != 0) {
printf("%d ",CursorList[P].X);
P = CursorList[P].Next;
}
printf("\n");
}
int main(int argc, const char * argv[])
{
printf("start ...\n");
InitializeCursorList();
List L = CursorAlloc();
Insert(L, L, 1);
Insert(L, L, 3);
Insert(L, L, 5);
Insert(L, L, 4);
Print(L);
Position P = FindPrevious(L, 3);
printf("%d\n",P);
Delete(L, 3);
Print(L);
DeleteList(L);
Print(L);
return 0;
}
算法是没有问题的,我写完之后测试了每个函数~
有什么问题请留言~
相关文章推荐
- 【学习】关于电梯算法的C++实现
- 数据结构学习系列二-链表的C++实现
- 算法学习 - 括号匹配(栈实现)C++
- 算法学习 - Bloom Filter(布隆过滤器)学习实现(C++实现)
- 算法学习 - Gray Code(格雷码)的解释和c++实现
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法
- C++学习之实现链表的增删查。
- 算法学习 - 后缀表达式 (C++ 栈实现)
- 算法学习第二课链表C语言实现
- 数据结构与算法学习 第1季02 链表的基本功能 C++实现
- 双向循环链表删除算法的C++程序实现
- 【C++数据结构学习笔记---栈】用链表实现栈
- 算法与数据结构课程中的c++实现的顺序表和链表
- 算法学习 - 堆排序 ( HeapSort ) C++实现
- 算法学习,单链表 C# 泛型实现
- 双向循环链表插入算法的C++程序实现
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- 【C++数据结构学习笔记---线性表】用单链表实现线性表
- 算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++
- 算法学习-哈夫曼编码(c++实现)