Linux C 数据结构---线性表

 数据结构指的是数据元素及数据元素之间的相互关系,包含下面三方面的内容:

 

    其中,线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

     线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。

特征:

1.集合中必存在唯一的一个“第一元素”;
2.集合中必存在唯一的一个 “最后元素” ;
3.除最后一个元素之外,均有 唯一的后继(后件);
4.除第一个元素之外,均有 唯一的前驱(前件);

    线性表作为一种基本的数据结构类型,在计算机存储器的映像(或表示)一般有两种形式:

1、顺序映像---即我们常用的数组

2、链式映像---即我们常用的链表

    今天,我们先来学习顺序存储结构:

一、顺序存储结构的表示

    1、顺序存储结构的特点:

1)逻辑上相邻的元素A(i)  A(i+1),其存储位置也是相邻的;

2)对数据元素A(i)的存取为随机存取或地址存取。

3)存储密度高。存储密度D=(数据结构中的元素所占存储空间)/(整个数据结构所占空间)

     2、顺序存储结构的不足:

     对表的插入和删除等运算的时间复杂度较差。

     3、顺序存储结构的表示:

在C语言中,一维数组的元素也是存放于一片连续的存储空间中,故可借助于C语言中一维数组类型来描述线性表的存储结构,即

[cpp] view plaincopy
  1. #define N 100  
  2.   
  3. typedef int data_t;//这样定义的目的是为了代码便于维护,如果下次表中数据类型为char,修改比较方便;  
  4. typedef struct  
  5. {  
  6.     data_t data[N];//表的存储空间  
  7.     int last;//当前表尾指针,对我们对数据的定位起到很大的作用  
  8. }sqlist_t,*sqlink_t;//顺序表类型  

指针 L 指向一个顺序表,我们的数据{a0,a1,a2........  last};

[cpp] view plaincopy
  1. sqlink_t L;  
  2. L = (sqlink_t *)malloc(sizeof(sqlink_t));  

这里我们定义的 int last ,可以表示{  } 、{ a0 }、{a0,a1}、{a0,a1......a99};

ai可以表示为 L->data[i] (0<=i<=L->last),一般情况下,0 < L->last < N,如果是空表{  },此时L->last = -1;

 

下面我们通过一个实例来看线性表基本算法的相关算法如何使用:

seqlist.h

[cpp] view plaincopy
  1. #ifndef _SEQ_LIST_H_  
  2. #define _SEQ_LIST_H_  
  3.   
  4. #include "datatype.h"  
  5.   
  6. #define MAX 100  
  7.   
  8. typedef struct {  
  9.     data_t  data[MAX];  
  10.     int last;   /* pointer to the position  
  11.              * in the array 'data' where  
  12.              * stores the last element of 
  13.              * the list 
  14.              */  
  15. } seqlist_t;  
  16.   
  17. /*  
  18.  * create a list and init it as empty  
  19.  * Input : void 
  20.  * Output: void 
  21.  * Return: new list, NULL when failed  
  22.  */  
  23. seqlist_t *CreateEmptySqlist();  
  24.   
  25. /*  
  26.  * destroy a list  
  27.  * Input : the list to be destroied.  
  28.  * Output: void 
  29.  * Return: void 
  30.  */  
  31. void DestroySqlist(seqlist_t *list);  
  32.   
  33. /* 
  34.  * clear the list and reset it as empty 
  35.  * Input : the list to be cleared.  
  36.  * Output: void 
  37.  * Return: void 
  38.  */  
  39. void ClearSqlist(seqlist_t *list);  
  40.   
  41. /*  
  42.  * judge if the list is empty 
  43.  * Input:   the list to be tested.  
  44.  * Output:  void 
  45.  * Return: 
  46.  *  1:  list is empty 
  47.  *  0:  not  
  48.  *  -1: error, e.g. the list is invalid 
  49.  */  
  50. int EmptySqlist(seqlist_t *list);  
  51.   
  52. /*  
  53.  * judge if the list is full  
  54.  * Input : the list to be tested.  
  55.  * Output: void 
  56.  * Return: 
  57.  *  1 : list is full 
  58.  *  0 : not  
  59.  *  -1: error 
  60.  */  
  61. int FullSqlist(seqlist_t *list);  
  62.   
  63. /*  
  64.  * get length of the list  
  65.  * Input : the list to be tested.  
  66.  * Output: void 
  67.  * Return:  
  68.  *  >= 0: length of the list; 
  69.  *   -1 : means error  
  70.  */  
  71. int LengthSqlist(seqlist_t *list);  
  72.   
  73. /* 
  74.  * get data of element at specified position 
  75.  * Input :  
  76.  *  list :  the list to be operated. 
  77.  *  at :    the position where to get the element at,  
  78.  *      position index starts from zero. 
  79.  * Output: 
  80.  *  x : the data value returned 
  81.  * Return: 
  82.  *  0 : success; 
  83.  *  -1: error, e.g. list is invalid; 'at' extends  
  84.  *      the range of the list     
  85.  */  
  86. int GetSqlist(seqlist_t *list, int at, data_t *x);  
  87.   
  88. /* 
  89.  * set/update data of element at specified position 
  90.  * Input :  
  91.  *  list :  the list to be operated. 
  92.  *  at :    the position at where to set the element,  
  93.  *      position index starts from zero 
  94.  *  x : the new data value 
  95.  * Output: void 
  96.  * Return: 
  97.  *  0 : success; 
  98.  *  -1: error, e.g. list is invalid; 'at' extends the  
  99.  *      range of the list    
  100.  */  
  101. int SetSqlist(seqlist_t *list, int at, data_t x);  
  102.   
  103. /*  
  104.  * Insert element at the specified position. If the "at" exceed the  
  105.  * upper limit of the list, append the data at the end of the list.  
  106.  * e.g. insert a new data into a {}. 
  107.  * Input :  
  108.  *  list :  the list to be operated. 
  109.  *  at :    the position at which to insert the new element,  
  110.  *      position index starts from zero. 
  111.  *  x : the data to be inserted  
  112.  * Output: void 
  113.  * Return: 
  114.  *  0 : success;  
  115.  *  <0: error  
  116.  */  
  117. int InsertSqlist(seqlist_t *list, int at, data_t x);  
  118.   
  119. /* 
  120.  * delete the element by the position 
  121.  * Input :  
  122.  *  list :  the list to be operated. 
  123.  *  at :    the position at which to delete the element,  
  124.  *      position index starts from zero 
  125.  * Output : void 
  126.  * Return : 
  127.  *  0 : success; 
  128.  *  !0 :    error   
  129.  */  
  130. int DeleteSqlist(seqlist_t *list, int at);  
  131.   
  132. #endif /* _SEQ_LIST_H_ */  

seqlist.c

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include "seqlist.h"  
  4.   
  5. seqlist_t *CreateEmptySqlist()  
  6. {  
  7.     seqlist_t *list;  
  8.     list = (seqlist_t *)malloc(sizeof(seqlist_t));  
  9.     if(list != NULL)  
  10.     {  
  11.         list->last = -1;//list->last初始化,空表中,list-last = -1;  
  12.     }  
  13.   
  14.     return list;  
  15. }  
  16.   
  17. void DestroySqlist(seqlist_t *list)  
  18. {  
  19.     if (list == NULL)  
  20.         return ;  
  21.       
  22.     free(list);  
  23.   
  24.     return;  
  25. }  
  26.   
  27. void ClearSqlist(seqlist_t *list)  
  28. {  
  29.     if (list == NULL)  
  30.         return ;  
  31.   
  32.     list->last = -1;//清空线性表  
  33.   
  34. }  
  35.   
  36. int EmptySqlist(seqlist_t *list)  
  37. {  
  38.     if (list == NULL)  
  39.         return -1;  
  40.       
  41.     if(list->last == -1)//空表的标志  
  42.         return 1;  
  43.     else  
  44.         return 0;  
  45. }  
  46.   
  47. int FullSqlist(seqlist_t *list)  
  48. {  
  49.     if (list == NULL)  
  50.         return -1;  
  51.   
  52.     if (MAX - 1 == list->last)  
  53.         return 1;  
  54.     else  
  55.         return 0;  
  56. }  
  57.   
  58. int LengthSqlist(seqlist_t *list)  
  59. {  
  60.     if (list == NULL)  
  61.         return -1;  
  62.     else  
  63.         return (list->last + 1);  
  64. }  
  65.   
  66. int GetSqlist(seqlist_t *list, int at, data_t *x) //data_t *x为出参  
  67. {  
  68.     if(list == NULL || at < 0 || at > list->last)  
  69.         return -1;  
  70.   
  71.     *x = list->data[at];  
  72.   
  73.     return 0;  
  74. }  
  75.   
  76. int SetSqlist(seqlist_t *list, int at, data_t x)//data_t x为入参  
  77. {  
  78.     if(list == NULL || at < 0 || (at > list->last))  
  79.         return -1;  
  80.   
  81.     list->data[at] = x;  
  82.   
  83.     return 0;  
  84. }  
  85.   
  86. int InsertSqlist(seqlist_t *list, int at, data_t x)  
  87. {  
  88.     int j;  
  89.     if(list == NULL || at < 0 || FullSqlist(list))  
  90.         return -1;  
  91.   
  92.     if(at > list->last)//此情况比较特殊,如表中长度是50,却要插在60前面,我们这里将其插在50后面,即at = list->last + 1  
  93.     {  
  94.         at = list->last + 1;//若是空表{},list->last为-1,此时将其放在第0位;  
  95.     }  
  96.     else  
  97.     {  
  98.         for(j = list->last; j >= at; j--)  
  99.         {  
  100.             list->data[j+1] = list->data[j];  
  101.         }  
  102.     }  
  103.   
  104.     list->data[at] = x;  
  105.     list->last++;//list->last要+1  
  106.   
  107.     return 0;  
  108. }  
  109.   
  110. int DeleteSqlist(seqlist_t *list, int at)  
  111. {  
  112.     int i;  
  113.     if(list == NULL || at < 0 || (at > list->last))  
  114.         return -1;  
  115.   
  116.     for(i = at + 1; i <= list->last;i++)  
  117.         list->data[i-1] = list->data[i];  
  118.   
  119.     list->last--;  
  120.   
  121.     return 0;  
  122. }  

main.c

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include "seqlist.h"  
  4. #include "datatype.h"  
  5.   
  6. void iterate_list(seqlist_t *list)  
  7. {  
  8.     int i;  
  9.       
  10.     printf("list.last = %d, list = {", list->last);  
  11.       
  12.     for (i = -1; i < list->last;) {  
  13.         printf("%d,", list->data[++i]);  
  14.     }  
  15.           
  16.     if (LengthSqlist(list) > 0)  
  17.         printf("\b}\n");  
  18.     else  
  19.         printf("}\n");  
  20.   
  21. }  
  22.   
  23. int main(int argc, const char *argv[])  
  24. {  
  25.     int i;  
  26.     int length;  
  27.     data_t a[10] = {2,4,6,8,10,12,14,16,18,20};  
  28.     data_t x;  
  29.     seqlist_t *list;  
  30.     list = CreateEmptySqlist();  
  31.   
  32.     if (list == NULL)  
  33.         return -1;  
  34.   
  35.     for(i = 0; i < 10;i++)  
  36.     {  
  37.         if((InsertSqlist(list,i,a[i])) < 0)  
  38.             break;  
  39.     }  
  40.     iterate_list(list);  
  41.     length = LengthSqlist(list);  
  42.     printf("The length of the list is %d\n",length);  
  43.   
  44.     GetSqlist(list,4,&x);  
  45.     printf("The NO.4 data of the list is %d\n",x);  
  46.     SetSqlist(list,4,5);  
  47.     GetSqlist(list,4,&x);  
  48.     printf("After updataing! The NO.4 data of the list is %d\n",x);  
  49.   
  50.     printf("Delete data[4]!\n");  
  51.     DeleteSqlist(list,4);  
  52.     GetSqlist(list,4,&x);  
  53.     printf("Now data[4] = %d\n",x);  
  54.     printf("Now the legth of the list is %d\n",LengthSqlist(list));  
  55.   
  56.     ClearSqlist(list);  
  57.     if(EmptySqlist(list))  
  58.         printf("The list is empty!\n");  
  59.   
  60.     printf("Now the legth of the list is %d\n",LengthSqlist(list));  
  61.   
  62.     DestroySqlist(list);  
  63.   
  64.     printf("The list is destroyed!\n");  
  65.   
  66.     return 0;  
  67. }  

makefile:

[cpp] view plaincopy
  1. OBJS = seqlist.o main.o  
  2. CFLAGS = -c -g -Wall  
  3. CC = gcc  
  4.   
  5. Test:$(OBJS)  
  6.     $(CC) -o Test -g $(OBJS)  
  7. main.o:main.c seqlist.h datatype.h  
  8.     $(CC) $(CFLAGS) main.c  
  9. seqlist.o:seqlist.c seqlist.h datatype.h  
  10.     $(CC) $(CFLAGS) seqlist.c  
  11.   
  12. clean:  
  13.     rm -rf Test *.o  

执行结果如下:

[cpp] view plaincopy
  1. fs@ubuntu:~/qiang/list$ make  
  2. gcc -c -g -Wall seqlist.c  
  3. gcc -c -g -Wall main.c  
  4. gcc -o Test -g seqlist.o main.o  
  5. fs@ubuntu:~/qiang/list$ ./Test   
  6. list.last = 9, list = {2,4,6,8,10,12,14,16,18,20}  
  7. The length of the list is 10  
  8. The NO.4 data of the list is 10  
  9. After updataing! The NO.4 data of the list is 5  
  10. Delete data[4]!  
  11. Now data[4] = 12  
  12. Now the legth of the list is 9  
  13. The list is empty!  
  14. Now the legth of the list is 0  
  15. The list is destroyed! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postman发送请求时带上登录信息

正常情况下&#xff0c;没有登录验证等公共接口&#xff0c;用postman进行get或post请求都很方便&#xff0c;加上相应的参数就行。 但是对于某些接口&#xff0c;可能需要先登录后才能请求&#xff0c;这时如果按正常的思路请求&#xff0c;可能就会被拦截了。 对于这种情况…

Chrome跨域问题

2019独角兽企业重金招聘Python工程师标准>>> 在chrome图标&#xff0c;右键--->属性 --->目标 路径末尾添加 “--disable-web-security” 重启即可 转载于:https://my.oschina.net/u/861562/blog/152171

Linux C 数据结构---单向链表

线性表存储结构分为顺序存储、链式存储。 顺序存储的优点&#xff1a; 顺序存储的缺点&#xff1a; 链表就是典型的链式存储&#xff0c;将线性表L &#xff08;a0,a1,a2,........an-1&#xff09;中个元素分布在存储器的不同存储块&#xff0c;成为结点&#xff08;Node&…

分页插件--根据Bootstrap Paginator改写的js插件

刚刚出来实习&#xff0c;之前实习的公司有一个分页插件&#xff0c;和后端的数据字典约定好了的&#xff0c;基本上是看不到内部是怎么实现的&#xff0c;新公司是做WPF的&#xff0c;好像对于ASP.NET的东西不多&#xff0c;导师扔了一个小系统给我和另一个同事&#xff0c;指…

Linux C 算法分析初步

提到算法&#xff0c;必须提到数据结构&#xff0c;我们要知道一个著名公式&#xff1a; 数据结构 算法 程序 我们先看看下面这张图&#xff1a; 算法是什么&#xff1f;算法是一个有穷规则&#xff08;或语句、指令&#xff09;的有续集和。他确定了解决某一问题的一个运算序…

hive实例,GPRS流量统计

2019独角兽企业重金招聘Python工程师标准>>> 最近面试&#xff0c;发现很多公司在使用hive对数据进行处理。 hive是hadoop家族成员&#xff0c;是一种解析like sql语句的框架。它封装了常用MapReduce任务&#xff0c;让你像执行sql一样操作存储在HDFS的表。 hive的表…

Linux C 数据结构—-循环链表

前面我们学习了单向链表&#xff0c;现在介绍单向循环链表&#xff0c;单向循环链表是单链表的一种改进&#xff0c;若将单链表的首尾节点相连&#xff0c;便构成单向循环链表结构&#xff0c;如下图&#xff1a; 对于一个循环链表来说,其首节点和末节点被连接在一起。这种方式…

预备作业03 20162320刘先润

第一次编代码 这几周自学了Linux基础入门&#xff0c;有好多想吐槽的地方&#xff0c;所以这篇随笔是带有半吐槽性质的&#xff0c;这是我学完后最真实的感受 我在电脑上按照教程安装了虚拟机&#xff0c;对于Linux这个完全陌生的概念也稍微算是有些理解&#xff0c;但是还有很…

JTable 失去焦点时取消编辑状态

为什么80%的码农都做不了架构师&#xff1f;>>> reference&#xff1a; http://tips4java.wordpress.com/2008/12/12/table-stop-editing/ 当JTable的单元格处于编辑状态时&#xff0c;如果用户触发以下事件&#xff0c;表格就会退出编辑状态&#xff0c;进而调用T…

Linux C 数据结构——栈

还是先把这张图贴出来&#xff0c;以便对比和理解 栈是限制在一段进行插入操作和删除操作的线性表&#xff08;俗称堆栈&#xff09;&#xff0c;允许进行操作的一端称为“栈顶”&#xff0c;另一固定端称为“栈底”&#xff0c;当栈中没有元素称为“空栈”。特点&#xff1a;先…

常用的HTTP状态码

2019独角兽企业重金招聘Python工程师标准>>> 第一、成功的状态码&#xff1a; 1&#xff09;200 OK – 服务器成功返回网页 2&#xff09;304 Not Modified – 未修改 第二、失败的状态码&#xff1a; 3&#xff09;404 Not F…

Linux C 数据结构——队列

还是先放这张图&#xff0c;以便对比和理解&#xff1a; 队列是限制在两端进行插入操作和删除操作的线性表&#xff0c;允许进行存入操作的一端称为“队尾”&#xff0c;允许进行删除操作的一端称为“队头”。当线性表中没有元素时&#xff0c;称为“空队”。特点&#xff1a;先…

如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间

1.安装FF的Firebug组件&#xff1a;点击FF的Tools的Add-ons菜单&#xff0c;输入Firebug关键字&#xff0c;并选择合适的版本Install。 2.安装完毕后地址栏右边会出现一个小虫图标&#xff0c;右边还有一个下拉箭头。如下图&#xff1a; 3.点击下拉箭头&#xff0c;选择“on fo…

Linux C 数据结构——二叉树

先放这张图&#xff1a; 可以看出&#xff0c;树是非线性结构&#xff1b; 一、树的概念 树&#xff08;tree&#xff09;是n(n>0)个节点的有限集合T&#xff0c;它满足两个条件&#xff1a; 1&#xff09;有且仅有一个特定的称为根&#xff08;root&#xff09;的节点&…

Linux C 算法——查找

所谓“查找”记为在一个含有众多的数据元素&#xff08;或记录&#xff09;的查找表中找出某个“特定的”数据&#xff0c;即在给定信息集上寻找特定信息元素的过程。 为了便于讨论&#xff0c;必须给出这个“特定的”词的确切含义。首先&#xff0c;引入一个“关键字”的概念&…

SharePoint项目中新建类库的错误处理及项目建设中遇到的问题总结

第一次SP项目总监遇到各种问题&#xff0c;以下是总结&#xff1a;问题1.创建SP项目的时候“场解决方案”跟“沙盒解决方案”是有区别的&#xff0c;具体可以看MSDN官方文档&#xff0c;这里简单摘抄如下&#xff1a;1&#xff09;场解决方案&#xff1a;承载与W3WP.exe中&…

ECharts学习(1)--简单图表的绘制

1.获取ECharts 官网 下载&#xff1a;http://echarts.baidu.com/download.html 2.在html页面中引入ECharts文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>ECharts练习</title><script type"text/javas…

Linux C 算法——排序

排序(Sort)是将无序的记录序列&#xff08;或称文件&#xff09;调整成有序的序列。 为了方便讨论&#xff0c;在此首先要对排序下一个确切的定义&#xff1a; 假设含有n个记录的序列为 { R1、R2、&#xff0c;。。。Rn } 其相应的关键字序列为 {K1、K2&#xff0c;。。。。Kn}…

JSON.parse 解析json字符串时,遇换行符报错

Json字符串转换成Json对象时候&#xff0c;有两种方式&#xff1a; 假设d是json字符串&#xff1a; 1&#xff0c;eval(( d ))。 2&#xff0c;JSON.parse(d)&#xff1b; 但是以上方式有隐患&#xff0c;如果Json字符串有换行的话&#xff0c;这样转换就会报错。 假如有…