您的位置:首页 > 其它

顺序表操作算法实现

2009-12-05 22:57 344 查看
看来以前的想法很傻很傻,约瑟夫循环还有一段时间,还是先从顺序表开始。

昨天下午在图书馆从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,学好数据结构,一切都触手可及!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐