数据结构与算法

一、什么是数据结构

    1、数据结构的起源

        1968年,美国高德纳教授,《计算机程序设计艺术》的第一卷《基本算法》的出版,开创了数据结构和算法的先河。

        数据结构是一门研究数据之间关系和操作的学科,而非计算方法。

        数据结构+算法=程序,沃斯凭借这个观点写的论文,获得图灵奖,这句话展示了整个程序的本质

    2、数据结构的基本概念

        数据:所有能够输入到计算机中,能够被程序处理的描述客观事物的符号。

        数据项:有独立含义的最小单位,也叫做域【结构的成员项】

        数据元素:组成数据的,有一定意义的基本单位,也叫做节点、记录。  

                一个数据元素由若干个数据项组成      【结构变量】

        数据结构:相互之间存在一种或多种特定关系的数据元素的集合

        算法:数据结构所具备的功能、解决特定问题的方法

    3、数据结构的三个方面

        数据的逻辑关系

        数据的存储关系

        数据结构的运算

二、逻辑关系和存储关系

    数据的逻辑关系:

        集合:       数据元素同属于一个集合,但元素之间没有任何关系。    

        线性结构:  数据元素之间存在一对一的关系    (表)

        树形结构:  数据元素之间存在一对多的关系    (树)

        图形结构:  数据元素之间存在多对多的关系    (图)

    数据的存储结构:

        顺序存储:数据元素存储在连续的内存中,用数据元素的相对位置来表示关系

            优点:支持随机访问、访问效率极高、适合查找数据

            缺点:空间利用率低、对内存要求高、插入、删除不方便

        链式存储:数据元素存储在彼此独立的内存空间中,每个数据元素中增加一个数据项用于存储其他元素的地址,以此来表示数据元素之间的关系。

            优点:空间利用率高、插入、删除方便、适合频繁增删数据

            缺点:不支持随机访问、只能从前到后逐个访问

    逻辑结构与存储结构的对应关系:

        表 顺序 链式

        树 链式 顺序

        图 顺序+链式

        每种逻辑结构采用什么物理存储方式没有明确规定,通常根据实现的难易程度以及对空间、时间方面的要求,来选择最合适的物理存储结构

三、数据结构的运算

    1、建立数据结构     creat/create

    2、销毁数据结构     destory

    3、清空数据结构     clean

    4、数据结构排序     sort

    5、插入元素         insert 

    6、删除元素         delete

    7、访问元素         access

    8、修改元素         modify

    9、查询元素         query

    10、遍历数据结构    show/print/ergodic

四、顺序表和链式表的实现

    顺序表:

        数据项:

            存储元素的内存首地址

            表的容量

            元素的数量

        运算:

            创建、销毁、清空、插入、删除、访问、查询、修改、排序、遍历

        注意:

            1、不要越界

            2、时刻保持元素的连续性

        优点:支持随机访问,修改、访问、排序的效率较高,大块的连续的内存不容易产生内存碎片

        缺点:对内存要求高(内存连续),插入、删除元素时不方便、效率低

    链式表;list

        节点的数据项:

            数据域:可以是若干个各种类型的数据项

            指针域:指向下一个节点

        由若干个节点通过指针域连接在一起,形成链式表

        不带头节点:第一个节点的数据域存储的是有效的数据

            添加、删除时有可能会改变第一个节点的指针指向,参数需要传递二级指针,而且删除第一个节点时还需要额外处理。

        带头节点的:第一个节点不使用,仅仅只是用来指向第一个数据域有效节点

            注意:操作需要从第二个节点开始(也就是第一个有效数据节点)开始

            注意:下标从第一个有效数据节点开始

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define MAX_LENGTH 4000 int ParseString(const char *parse_str, int *letter_num, int *space_num, int *total_num, const char *stat_str, int *str_num); int main(int argc, char **argv) { int letter_num, space_num, total_num, str_num; const char *stat_str = "abc "; char input_str[MAX_LENGTH]; char parse_str[MAX_LENGTH]; FILE *fd = NULL; fd = fopen( "data.txt ", "wb+ "); //err while ( 1 ) { fgets(input_str, MAX_LENGTH, stdin); //err if ( *input_str == '# ' ) break; fwrite(input_str, 1, strlen(input_str)-1, fd); //err *input_str = '\r '; *(input_str+1) = '\n '; fwrite(input_str, 1, 2, fd); //err } fseek(fd, 0, SEEK_SET); //err memset(parse_str, 0, MAX_LENGTH); fread(parse_str, 1, MAX_LENGTH, fd); //err fclose(fd); ParseString(parse_str, &letter_num, &space_num, &total_num, stat_str, &str_num); printf( "parse result : letter-%d, space-%d, total size-%d, num of '%s '-%d\n ", letter_num, space_num, total_num, stat_str, str_num); return 0; } int ParseString(const char *parse_str, int *letter_num, int *space_num, int *total_num, const char *stat_str, int *str_num) { int tmp_letter=0, tmp_space=0, tmp_total=0, tmp_str=0; char *p, *q; for ( p=parse_str; *p!=0; p++ ) { if ( isalpha(*p) != 0 ) tmp_letter++; //if ( isspace(*p) != 0 ) if ( *p == ' ' ) tmp_space++; } for ( p=parse_str; *p!=0; p++ ) { q = strstr(p, stat_str); if ( q != NULL ) { tmp_str++; p = q + strlen(stat_str); } else { break; } } *letter_num = tmp_letter; *space_num = tmp_space; *total_num = strlen(parse_str); *str_num = tmp_str; return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值