顺序表操作算法实现
2009-12-05 22:57
344 查看
看来以前的想法很傻很傻,约瑟夫循环还有一段时间,还是先从顺序表开始。
昨天下午在图书馆从3点到9点,终于扣出来严蔚敏数据结构算法2.1,出来时候接近瘫痪,今早醒来惊奇发现,再去实现算法是那么简单。老话讲得对,敲代码才是硬道理。
简单记录一下今天收获。准备工作:
开始main函数实现:初始化空表La,插入若干元素,不妨假定7个,开始删除操作:
完善之后运行又崩溃,看来又是指针惹的祸。偶然发现编译器报warning错:local variable 'e' used without having been initialized.说是偶然发现,实际上因为VC的编译器有个毛病,只要编译下来没错误,即使你有警告,最后都显示0 error(s), 0 warning(s).而那个最底下输出栏窄得只能容纳这短短几行字,于是瞄一眼,自然觉得没问题,万万没想到,致命的Bug在编译的时候已经产生了,所以以后一定要重视Warning的错。而这个错恰巧在死锁的时候发现的,看来令人崩溃的死锁也有有用的一面。接着上文说道,指针定义没有初始化,确实,int *e仅仅分配了空间,却没指向明确的对象,没错,指针悬垂!知道问题所在就好办了,改代码如下:
之后觉得可以综合成查找的程序,用LocateElem就可以实现。做成之后添加删除功能,再次运行,查找没问题,接下来回车后删除功能的部分自动结束,惊奇地发现若将ElemType改成int类型则不存在这个问题。自动结束?我并没有下命令,仅仅回车了一下……对了,回车,字符,OK,getchar!加上此函数,运行,搞定。
最后添加人机交互功能,由于getchar的原因,只能花点篇幅用while循环,于是顺序表几个基础操作成功close。
总结了一下,函数指针熟悉了不少,另外对指针又有了新的看法,它就是一寄生虫,一旦寄生到你身上,就完全被它控制,它操纵了寄主的所有行为,即取代了寄主,进而改变寄主的所有特征。最后就是基础算法的问题,看起来简单,实现起来很艰难,可是一旦练熟了,往前走起来又渐渐变得明朗。这时候就尝到了点甜头。天天说敲代码,敲的是什么,就是这些基础操作,把这些算法包装好,以后的操作直接拿来用,而前提是对这些算法烂熟于心,练到炉火纯青的地步,而这正是我现在的工作。似乎MFC就是实现了这些基础类的封装,想到MFC,又想到C++,Windows,学好数据结构,一切都触手可及!
昨天下午在图书馆从3点到9点,终于扣出来严蔚敏数据结构算法2.1,出来时候接近瘫痪,今早醒来惊奇发现,再去实现算法是那么简单。老话讲得对,敲代码才是硬道理。
简单记录一下今天收获。准备工作:
#include <stdio.h> #include <malloc.h> #include <process.h> #define OK 1 #define ERROR 0 #define INIT_LIST_SIZE 256 #define LIST_INCREMENT 2 typedef int Status; typedef char ElemType; typedef struct { ElemType *elem; //分配空间基址 int lenth; //当前空间长度 int listsize; //当前分配空间大小 }SqList; Status InitList(SqList *L) //构造一个空表 Status ListInsert(SqList *L, int i, ElemType e) /*在L中第i个位置前插入e,并将表长加1,代码省略*/ Status ListTraverse(SqList L, void(*visit)(ElemType*)) /*将表中每一个元素调用依次visit函数,代码省略*/ Status ListDelete(SqList *L, int i, ElemType *e) /*将表中第i个元素删除,并用e返回删除的元素,代码省略*/ int LocateElem(SqList L, ElemType e, int(*compare)(ElemType, ElemType)) /*返回L中第一个与e满足compare关系的元素的位序,若不存在,返回0,代码省略*/ void print(ElemType *p) { printf("%c ",*p); } int equal(ElemType e1, ElemType e2) { return e1 == e2; }
开始main函数实现:初始化空表La,插入若干元素,不妨假定7个,开始删除操作:
ElemType *e; ListDelete(&List, 3, e);
完善之后运行又崩溃,看来又是指针惹的祸。偶然发现编译器报warning错:local variable 'e' used without having been initialized.说是偶然发现,实际上因为VC的编译器有个毛病,只要编译下来没错误,即使你有警告,最后都显示0 error(s), 0 warning(s).而那个最底下输出栏窄得只能容纳这短短几行字,于是瞄一眼,自然觉得没问题,万万没想到,致命的Bug在编译的时候已经产生了,所以以后一定要重视Warning的错。而这个错恰巧在死锁的时候发现的,看来令人崩溃的死锁也有有用的一面。接着上文说道,指针定义没有初始化,确实,int *e仅仅分配了空间,却没指向明确的对象,没错,指针悬垂!知道问题所在就好办了,改代码如下:
ElemType e; ListDelete(&List, 3, &e);OK,问题解决!
之后觉得可以综合成查找的程序,用LocateElem就可以实现。做成之后添加删除功能,再次运行,查找没问题,接下来回车后删除功能的部分自动结束,惊奇地发现若将ElemType改成int类型则不存在这个问题。自动结束?我并没有下命令,仅仅回车了一下……对了,回车,字符,OK,getchar!加上此函数,运行,搞定。
最后添加人机交互功能,由于getchar的原因,只能花点篇幅用while循环,于是顺序表几个基础操作成功close。
总结了一下,函数指针熟悉了不少,另外对指针又有了新的看法,它就是一寄生虫,一旦寄生到你身上,就完全被它控制,它操纵了寄主的所有行为,即取代了寄主,进而改变寄主的所有特征。最后就是基础算法的问题,看起来简单,实现起来很艰难,可是一旦练熟了,往前走起来又渐渐变得明朗。这时候就尝到了点甜头。天天说敲代码,敲的是什么,就是这些基础操作,把这些算法包装好,以后的操作直接拿来用,而前提是对这些算法烂熟于心,练到炉火纯青的地步,而这正是我现在的工作。似乎MFC就是实现了这些基础类的封装,想到MFC,又想到C++,Windows,学好数据结构,一切都触手可及!
相关文章推荐
- 算法数据结构 单链表的实现+操作 以及和顺序表的对比
- 编写程序,实现顺序栈的创建、进栈和出栈等基本操作算法。
- 顺序栈10种操作的实现
- 二叉树遍历非递归算法所用到的栈以及层次遍历所用到的队列的基本操作算法的实现
- 编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)
- 【算法设计-优先队列】优先队列的实现与操作
- 数据结构-线性表的顺序存储实现及各种操作代码
- 【数据结构作业一】写出顺序表的结构体类型定义及查找、插入、删除算法,并以顺序表作存储结构,实现线性表的插入、删除
- 数据结构学习之路(五)顺序查找和折半算法的原理及实现
- 【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C++)
- 实现顺序查找的算法
- 查找(顺序、二分、斐波那契和插值)算法的实现和测试
- 算法与数据结构--实现线性表的合并操作(合并后按非递减排列)--算法2.6
- 采用顺序存储实现循环队列的初始化、入队、出队操作。
- 顺序查找与二分查找的算法实现
- 线性表的顺序存储实现及相关操作 C语言版
- 顺序表上进行增,删,查,改操作,C++实现
- 【数据结构】用C++实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- 顺序查找算法实现(C++)
- 【算法导论-34】红黑树、顺序统计树的Java实现