算法实例_线性表

                                                                        By:比方

  1. 什么是线性表?

        从线性表的功能逻辑上来看,线性表就是由n(n>=0)个数据元素的排序组合,数据由x1,x2,x3,...,xn结构有序的顺序排列。

  1. 线性表的结构和特点

1.              仅有一个开始节点x1,没有直接前趋节点,有妾只有一个直接后续节点x2;

2.              仅有一个终结节点xn,仅有一个前趋节点xn-1;

3.              对于同一个线性表,其中没一个数据的元素,都必须具备相同的数据结构类型,

              且没一个元素的长度相同。

顺序表

  

线性表的基本流程

  1. 初始化
  2. 计算表长
  3. 获取节点
  4. 查找节点
  5. 插入节点
  6. 删除节点
  7. 显示节点
 1 顺序表的结构定义
 2 #define MaxTableLen 100    //顺序表最大长度
 3
 4 typedef struct             //要存储的数据结构
 5 {
 6     char Key[10];
 7     char Name[12];
 8     int  Age;
 9 }DATA;
10
11 typedef struct             //顺序表的结构
12 {
13     DATA LisiData[MaxTableLen+1];  //保存顺序表结构的数组
14     int  ListLen;                  //顺序表中已存节点的数量
15 }LISTTPYE;

1. 线性表的初始化如下

1 void  ListInit(LISTTPYE  *ListPY )   //初始化为一个空的表
2 {
3     ListPY->ListLen = 0;
4 }

计算顺序表中一共存放了多少数据

1 int ListLengh(LISTTPYE *ListPY)   //计算顺序表中的数量
2 {
3     return ListPY->ListLen;
4 }

插入一个数据到顺序表中

 1 int  ListInst(LISTTPYE *ListPY,int  n,DATA Data)
 2 {
 3     int i;
 4
 5     if (ListPY->ListLen >= MaxTableLen)     //判断顺序表是否已经存满
 6     {
 7         printf("顺序表已经存满!\r\n");
 8         return 0;
 9     }
10
11     if ((n < 1) || (n > ListPY->ListLen-1))//插入节点的序号不正确
12     {
13         printf("插入数据错误\r\n");
14         return 0;
15     }
16
17     for (i = ListPY->ListLen; i >= n;i--) //将顺序表的节点往后移动
18     {
19         ListPY->LisiData[i+1] = ListPY->LisiData[i];
20     }
21
22     ListPY->LisiData[n]= Data;
23
24     ListPY->ListLen++;
25
26     return 1;
27
28 }

增加一个数据

 1 int ListAdd(LISTTPYE *ListPY,DATA Data) //增加顺序表中的数据
 2 {
 3     if (ListPY->ListLen >= MaxTableLen)
 4     {
 5         printf("顺序表已经满了\r\n");
 6         return 0;
 7     }
 8
 9     ListPY->LisiData[++ListPY->ListLen] = Data;
10
11     return 1;
12 }

删除

 1 int ListDelect(LISTTPYE *ListPY,int n) // 删除顺序表中的元素
 2 {
 3     int i;
 4     if ((n < 1) ||  ( n > ListPY->ListLen+1))   //检查节点序号是否正确
 5     {
 6         printf("删除节点错误\r\n");
 7         return 0;
 8     }
 9
10     for (i = n ; i < ListPY->ListLen ; i++)    //顺序表数据向前移动
11     {
12         ListPY->LisiData[i] = ListPY->LisiData[i+1];
13     }
14
15     ListPY->ListLen--;   //顺序表元素-1
16
17     return 1;
18 }

查找顺序表的数据

 1 DATA *ListFindNum(LISTTPYE *ListPY,int n)       //按照序号查找内容,返回数据
 2 {
 3     if ( (n < 1) || (ListPY->ListLen +1))
 4     {
 5         printf("节点序号错误,无法返回节点\r\n");
 6         return NULL;
 7     }
 8
 9     return &(ListPY->LisiData[n]);
10
11 }

同上

 1 int ListFindStr(LISTTPYE *ListPY,char *Key)              //按照关键字查找信息
 2 {
 3     int i;
 4     for ( i = 1; i <ListPY->ListLen; i++)
 5     {
 6         if (strcmp(ListPY->LisiData[i].Key,Key) == 0)
 7         {
 8             return i;
 9         }
10     }
11     return 0;
12 }

显示顺序表中所有的内容

 1 int ListAll(LISTTPYE *ListPY)
 2 {
 3     int i;
 4     for (i = 1; i <ListPY->ListLen;i++)
 5     {
 6         printf("%s\t%s\t%d \r\n",ListPY->LisiData[i].Key,ListPY->LisiData[i].Name,ListPY->LisiData[i].Age);
 7     }
 8
 9     return 0;
10 }

实例调用样例

 1 int main(int argc, char* argv[])
 2 {
 3     int i;
 4     LISTTPYE   ListPY;
 5     DATA       Data;
 6     DATA*      pData;
 7     char       Key[12];
 8
 9     ListInit(&ListPY);//初始化顺序表
10
11     do
12     {
13         printf("输入(学号,姓名,年龄)\r\n");
14         fflush(stdin);
15         scanf("%s %s %d",&Data.Key,&Data.Name,&Data.Age);
16         if (Data.Age)
17         {
18             if (!ListAdd(&ListPY,Data))  //插入节点
19             {
20                 break;
21             }
22         }
23         else
24         {
25             break;
26         }
27
28     } while (1);
29
30
31     printf("顺序表的节点顺序为:\r\n");
32     ListAll(&ListPY);
33     fflush(stdin);  //清空缓冲区
34
35
36     printf("要查找节点的关键字\r\n");
37     scanf("%s",Key);
38     i = ListFindStr(&ListPY,Key);
39     pData = ListFindNum(&ListPY,i);
40     if (pData)
41     {
42         printf("第%d节点为:(%s,%s,%d)\r\n",pData->Key,pData->Name,pData->Age);
43     }
44
45     return 0;
46 }

附件地址:http://pan.baidu.com/s/1pJ2Vlov

转载于:https://www.cnblogs.com/hailunchina/p/3878628.html

算法实例_线性表 By:比方相关推荐

  1. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...

  2. 判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 其实这些 ...

  3. Java数据结构与算法_线性表_顺序表与链表

    文章目录 线性表 顺序表 顺序表API设计 顺序表的代码实现 链表 单向链表 双向链表 总结 线性表 概述 线性表是最基本.最简单.也是最常用的一种数据结构. 一个线性表是n个具有相同特性的数据元素的 ...

  4. 【数据结构与算法】之线性表的应用和操作

    数据结构概念 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 数据结构的逻辑结构:数据对象中数据元素之间的相互关系,分为线性结构.树形结构.图形结构以及集合结构. 数据结构的物理结构:数 ...

  5. 数据结构与算法:06 线性表

    06 线性表 知识结构: 1. 线性表的定义与操作 1.1 线性表的定义 线性表(Linear List)是由n(n≥0)n (n≥0)n(n≥0)个相同类型的数据元素a0,a1,⋯,an−1a_0, ...

  6. Algorithms_基础数据结构(02)_线性表之链表_单向链表

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 顺序表VS 链表 链表的定义 链表的特点 常见的链表结 单向链表 单向链表的查找 单向链表的插入 头插 尾部插入 中间 ...

  7. Algorithms_基础数据结构(01)_线性表之数组数组的应用案例分析

    文章目录 大纲图 数组的经典面试题目 数据结构三要素 数据逻辑结构(线性结构&非线性结构) 数据存储结构(顺序存储.链式存储.索引存储和散列存储) 顺序存储 链式存储 索引存储 散列存储 数据 ...

  8. echart data放入数组_线性表(数组、链表、队列、栈)详细总结

    线性表是一种十分基础且重要的数据结构,它主要包括以下内容: 数组 链表 队列 栈 接下来,我将对这四种数据结构做一个详细的总结,其中对链表实现了十几种常见的操作.希望对你有所帮助. 1.数组 数组(A ...

  9. 数据结构与算法笔记(二) 线性表(数组描述)

    c++常用的数据描述方法是数组描述和链式描述,线性表可以用来说明这两方法,先介绍数组描述的线性表.后面再介绍链式描述的线性表. C++ STL容器vector和list相当于线性表的数组描述和链式描述 ...

最新文章

  1. 网络整合营销概念2015
  2. python机器学习库sklearn——BIRCH聚类
  3. STL源码剖析heap
  4. USB总线-Linux内核USB3.0设备控制器驱动框架分析(四)
  5. android 第三方键盘,6款Android平台第三方输入法横评
  6. nifi集群_【NIFI】 Apache NiFI 集群搭建
  7. HTML5期末大作业:网站设计——天天生鲜水果蔬菜商城网站静态模板 (10个页面) HTML+CSS+JavaScript...
  8. 无心剑中译泰戈尔《漂鸟集(1~10)》
  9. 论文整理:Probabilistic Logic Neural Networks for Reasoning
  10. 自动驾驶中的多传感器融合
  11. Raspberry Pi使用教程
  12. java游戏房间匹配_一种游戏房间匹配方法与流程
  13. Android显示系统详解
  14. 如何利用无线技术有效预化工厂防爆炸事故?
  15. win10笔记本触摸板点击没反应
  16. 关于证书(certificate)和公钥基础设施(PKI)的一切
  17. 破解TP-Link路由-嗅探PPPoE拨号密码
  18. jquery 动态按钮绑定点击事件
  19. 没有伞的孩子必须努力奔跑!
  20. Unity2DRelative Joint 2D详解

热门文章

  1. require,import和import()函数的区别
  2. 习题 5.7 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小(也可能没有鞍点)。
  3. Adobe欲统一相机RAW格式的格式——DNG数码负片
  4. android测试版微信7.0下载地址,微信7.0.7下载地址-微信 7.0.7安卓内测版下载-西西软件下载...
  5. Windows7和Windows10设置屏保保护程序-冒泡
  6. 赵小楼:《天道》《遥远的救世主》深度解析(17)私募基金的股东们对丁元英的相爱相杀
  7. Linux Wifi共享上网脚本,类似win 7的Connectify工具
  8. GEE哨兵二号去云不成功的原因(代码修改)
  9. Python入门(一):一句话统计文章不重复汉字数
  10. 百度2015春季实习生招聘附加题