数据结构学习笔记(三)
来源:互联网 发布:c语言class怎么用 编辑:程序博客网 时间:2024/05/16 08:36
深入理解抽象数据类型;
ADT是一些操作的集合,是数学的抽象,在ADT的定义中根本没涉及如何实现操作的集合,这个可以看作是模块化设计的补充。这些操作在程序只编写一次,而程序中任何其他部分需要在该ADT上运行其中的一种操作时可以通过调用适当的函数来进行,若需要改变操作细节,只需要修改运行这些ADT操作的例程就可以。
对所有的表操作都可以通过使用数组来实现,虽然数组是动态指定的,但是还是需要对标的最大值进行估计,并且插入和删除操作需要二次时间,所以简单数组一般不用来实现这种结构。而为了减少顺序列表的插入和删除带来的时间浪费,我们需要可以不连续储存的形式,这符合链式列表的想法。
然而有顺序表转换为链式列表会遇到一下三个问题:
1.不存在从表的前面插入元素的方法;
2.从最前面删除一个元素是一个特殊情况,因为它改变了表的起始位置,这将会造成表的丢失;
3.虽然上述指针移动很简单,删除一个元素时,但是,这要求我们必须记住删除元素前面的表格元素。
然而当我们在开头再加上一个空指针时就很容易的解决以上三个问题;
接下来设计一个表,按照C语言的约定,作为list表和Position以及函数的原型都列在所谓的头文件中,具体的Node节点则在.C文件中:
typedef int ElementType#ifdef _List_Hstruct Node;//声明节点为结构体类型typedef struct Node *PtrToNode;typedef PrtToNode List;typedef PtrToNode Position;List MakeEmpty(List L);//置空函数int IsEmpty(List L);//是否为空int IsLast(List L);//是否是到最后了void Delete(ElementType X,List L);//删除指定位置的元素Position Find(ElementType X,List L);//返回X在表中的位置Position FindPrevious(ElementType X,List L);//返回X元素的前驱的位置void Insert(ElementTypeX, List L,Positon P);//在P处后面插入元素X插入元素void DEeleteList(List L);//删除整个表Position Header(List L);//表头的位置Position First(List L);//表中第一个元素的位置Position Advance(Position P);//移动到位置PElementType Retrieve(Position P);//P处的元素值#endif
建立Node节点信息的单元,包含一个数据体和一个指针
struct Node { ElementType Element; Position Next; };实现第一个方法:将列表置空:
List MakeEmpty( List L ) { if( L != NULL ) DeleteList( L ); L = malloc( sizeof( struct Node ) ); if( L == NULL ) FatalError( "Out of memory!" ); L->Next = NULL; return L; }检验是否为空的函数实现如下:
int IsEmpty( List L ) { return L->Next == NULL; }
检验数据是不是最后一个位置:
int IsLast( Position P, List L ) { return P->Next == NULL; }查找位置:
Position Find( ElementType X, List L ) { Position P;/* 1*/ P = L->Next;/* 2*/ while( P != NULL && P->Element != X )/* 3*/ P = P->Next;/* 4*/ return P; }
若删除列表中的元素,则:
void Delete( ElementType X, List L ) { Position P, TmpCell; P = FindPrevious( X, L ); if( !IsLast( P, L ) ) /* Assumption of header use */ { /* X is found; delete it */ TmpCell = P->Next; P->Next = TmpCell->Next; /* Bypass deleted cell */ free( TmpCell ); } }
寻找某个元素的前一个位置:
Position FindPrevious( ElementType X, List L ) { Position P;/* 1*/ P = L;/* 2*/ while( P->Next != NULL && P->Next->Element != X )/* 3*/ P = P->Next;/* 4*/ return P; }
在线性表中插入某个数据:
void Insert( ElementType X, List L, Position P ) { Position TmpCell;/* 1*/ TmpCell = malloc( sizeof( struct Node ) );/* 2*/ if( TmpCell == NULL )/* 3*/ FatalError( "Out of space!!!" );/* 4*/ TmpCell->Element = X;/* 5*/ TmpCell->Next = P->Next;/* 6*/ P->Next = TmpCell; }删除整个列表:
void DeleteList( List L ) { Position P;/* 1*/ P = L->Next; /* Header assumed *//* 2*/ L->Next = NULL;/* 3*/ while( P != NULL ) {/* 4*/ free( P );/* 5*/ P = P->Next;
P=Tmp; } }
返回表的位置和元素信息等:包括表的Header,表的第一个元素的位置,以及元素的类型等
Position Header( List L ) { return L; } Position First( List L ) { return L->Next; } Position Advance( Position P ) { return P->Next; } ElementType Retrieve( Position P ) { return P->Element; }
测试文件如下:
#include <stdio.h>#include "list.h"voidPrintList( const List L ){ Position P = Header( L ); if( IsEmpty( L ) ) printf( "Empty list\n" ); else { do { P = Advance( P ); printf( "%d ", Retrieve( P ) ); } while( !IsLast( P, L ) ); printf( "\n" ); }}main( ){ List L; Position P; int i; L = MakeEmpty( NULL ); P = Header( L ); PrintList( L ); for( i = 0; i < 10; i++ ) { Insert( i, L, P ); PrintList( L ); P = Advance( P ); } for( i = 0; i < 10; i+= 2 ) Delete( i, L ); for( i = 0; i < 10; i++ ) if( ( i % 2 == 0 ) == ( Find( i, L ) != NULL ) ) printf( "Find fails\n" ); printf( "Finished deletions\n" ); PrintList( L ); DeleteList( L ); return 0;}
0 0
- 数据结构学习笔记(三)
- 数据结构学习笔记(三)
- 数据结构学习笔记(三)
- 数据结构学习笔记(三)
- 数据结构学习笔记三
- 大话数据结构学习笔记(三)
- Python学习笔记(三)-- 数据结构
- Python学习笔记-初级(三):数据结构
- nginx 学习笔记(三)基本数据结构
- 《大话数据结构》学习笔记(三)
- 数据结构学习(三)
- 数据结构学习笔记(三)字符串及KMP算法
- 数据结构学习笔记之三(二叉树)
- 学习笔记:数据结构(三)内核链表
- 小楼一阁的数据结构学习笔记(三、单链表)
- 学习笔记之数据结构与算法(三)
- 数据结构学习笔记(三)栈及其C++实现
- 学习Javascript数据结构与算法系列笔记(三):集合
- 1119. Pre- and Post-order Traversals (30)
- 欢迎使用CSDN-markdown编辑器
- BZOJ 4241: 历史研究
- 每天近百亿条用户数据,携程大数据高并发应用架构涅槃
- 字符串排序:oj Problem C: 国家排序
- 数据结构学习笔记(三)
- 浏览器渲染网页的过程
- 递归的理解
- 运维学习23
- Linux 常用开发工具笔记1
- Why is FreeBSD deprecating GCC in favor of Clang/LLVM?
- 测试标题
- csdl,msl,ssdl
- RTC实时时钟