算法实例_线性表 By:比方

算法实例_线性表

                                                                        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

算法实例_线性表 By:比方

时间: 2024-10-24 14:34:18

算法实例_线性表 By:比方的相关文章

算法实例_链表结构 By:比方

前一章,我们说到了顺序表结构,而顺序表也存在一些的缺点. 在插入或者删除节点的时候,需要移动的数据比较大,如果顺序表结构比较大,有时候比较难以分配足够的连续存储空间,可能会导致内存分配失败,而导致无法存储. 而今天我们讲解的链表结构则可以很好的解决这个问题,链表的结构是一种动态存储分配的结构形式,可以根据需要动态申请所需的内存单元. 一.什么是链表结构? a)         我们用head来表示头节点. b)         数据部分保存的是存储的数据,地址地方指向下一个数据的起始部分,依次向

Hibernate_11_继承实例_多表

<1>每个类都建立一张表,抽象类也建立一张表,各张表中只包含自  己的属性,子类继承的属性不用在子类中显示.    父类 Article,子类Topic .Reply .Session生成类.持久化层 .主文件配置 (与10中相同) Article.hmb.xml文件的配置: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mappi

C算法与数据结构-线性表的应用,多项式求和---ShinePans

/*---上机作业作业,二项式加法---*/ /*---By 潘尚 ---*/ /*---日期: 2014-5-8 . ---*/ /*---题目:---*/ //假设有两个稀疏多项式A和B,设计算法完成下列任务 //1.输入并建立多项式A和B; //2.求两个多项式的和多项式C; //3.求两个多项式的积多项式D; //输出4个多项式A,B,C,D; #include <stdio.h> #include <stdlib.h> #include <string.h>

数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例

1>//栈是先进后出,后进先出的线性表 简称LIFO线性表 //栈的顺序存储结构成为顺序栈(sequebtial stack). //顺序栈利用一组地址连的存储单元依次存放从栈底到 栈顶的数据元素,通常用一维数组存放栈的元素 //"指针"top并非指针,而是表示栈顶元素的当前位置 //top不是指针型变量而是整形变量,top=0空栈,top=MaxSize 表示满栈,当top>maxsize 表示栈溢出 代码 #include <stdio.h> #includ

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几

C++ _数据结构 _线性表的顺序存储

#ifndef __MY_SEQLIST_H__ #define __MY_SEQLIST_H__ typedef void SeqList; typedef void SeqListNode; //链表 创建 SeqList* SeqList_Create(int capacity); //链表 销毁 void SeqList_Destroy(SeqList* list); ////链表 清空 void SeqList_Clear(SeqList* list); //链表 长度 int Seq

数据结构_线性表_链式存储_双向循环链表的基本操作

//双向链表,将头结点和尾结点链接起来,就构成了双向循环链表 //双向循环链表是将头结点的前驱指针指向了尾结点,同时将尾结点的后劲指针指向了头结点. //空表,头结点的前驱和后继指针均指向了自己,这也是判断双向循环链表是否为空的条件, //双向循环链表具有对称性 //缺点,是要付出空间代价的 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 代

数据结构与算法 Chapter 2 线性表

2.1 线性表定义 线性表是由长度为n的一组节点组成的有限序列,其中除了首末结点之外,每个结点都有直接的前驱结点和后继结点. 2.2 线性表的顺序存储结构 顺序存储结构使用一组连续的存储单元来存储线性表. 其特点有:线性表的逻辑顺序与物理顺序一致.数据元素之间的关系采用物理位置的相邻来表示.其可以随机存取,常用一维数组表示: #include <iostream> using namespace std; template<class Elem> class Alist { pri

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和