线性表学习
时间:2022-05-15
本文章向大家介绍线性表学习,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
线性表是最常用也是最简单的一种数据结构,一个线性表是n个数据元素的有限序列。
线性表的基本结构:
1 typedef struct xianxing{
2 int length;
3 int *data;
4 }L;
其中int *data也可以换成是一个数组,如int data[maxsize];maxsize你自己定咯,我这里用指针,然后初始化的时候申请动态空间。
上面是基本结构,然后要初始化咯,就是给他赋初值啦。代码如下:
1 int InitList(xianxing &L){//初始化相性表L
2 L.length=0;
3 L.data=(int *)malloc(ElemNum*sizeof(int));//申请空间,线性表最大容量:ElemNum个正数
4 if(!L.data)exit(0);
5 return 1;
6 }
插入元素:
1 int InsertList(xianxing &L,int i,int e){//将数值e插入线性表L第i个位置
2 if(i<1||i>L.length+1)return 0;
3 int *k,*m;
4 m=(L.data+i-1);
5 for(k=(L.data+L.length-1);k>=m;--k){
6 *(k+1)=*k;
7 }
8 *m=e;
9 ++L.length;
10 return 1;
11 }
删除元素:
1 int ListDelete(xianxing &L,int i,int &e){//删除L中第i的位置的数值,并将这个值赋值给e
2 if(i<1||i>L.length)return 0;
3 e=L.data[i-1];
4 int *p;
5 for(p=L.data+i-1;p<L.data+L.length-1;p++){
6 *p=*(p+1);
7 }
8 --L.length;
9 return 1;
10 }
有以上代码基本就可以生成一个线性表了,数据你自己输入,后面的代码有输入方式。比较完整的代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<ctype.h>
4 #define ElemNum 100
5 typedef struct xianxing{
6 int length;
7 int *data;
8 }L;
9 int InitList(xianxing &L){//初始化相性表L
10 L.length=0;
11 L.data=(int *)malloc(ElemNum*sizeof(int));//申请空间,线性表最大容量:ElemNum个正数
12 if(!L.data)exit(0);
13 return 1;
14 }
15 int InsertList(xianxing &L,int i,int e){//将数值e插入线性表L第i个位置
16 if(i<1||i>L.length+1)return 0;
17 int *k,*m;
18 m=(L.data+i-1);
19 for(k=(L.data+L.length-1);k>=m;--k){
20 *(k+1)=*k;
21 }
22 *m=e;
23 ++L.length;
24 return 1;
25 }
26 int ListDelete(xianxing &L,int i,int &e){//删除L中第i的位置的数值,并将这个值赋值给e
27 if(i<1||i>L.length)return 0;
28 e=L.data[i-1];
29 int *p;
30 for(p=L.data+i-1;p<L.data+L.length-1;p++){
31 *p=*(p+1);
32 }
33 /*for(p=&(L.data[i-1]);p<&(L.data[L.length-1]);p++){
34 *p=*(p+1);
35 }//跟上面的写法是一样的*/
36 --L.length;
37 return 1;
38 }
39 int LocateElem(xianxing L,int e,int &l){//查找L中数e第一次出现的位置并赋值给l
40 int *p;
41 l=-1;//l=-1表示没找到,外部要判断
42 for(p=L.data;p<=L.data+L.length-1;p++){
43 if(*p==e){
44 l=p-L.data;
45 break;
46 }
47 }
48 }
49 int shuru(xianxing &L){//对已经初始化了的线性表输入一串数
50 int i=0,t=0;
51 while(i<ElemNum){
52 scanf("%d",&t);//输入数值
53 if(t==-1)break;//输入-1表示输入结束
54 InsertList(L,i+1,t);//插入数值
55 i++;
56 }
57 }
58 int MergeList(xianxing &La,xianxing &Lb,xianxing &Lc){//合并两个线性表
59 int *pa,*pb,*pc;
60 int *pa_last,*pb_last;
61 pa=La.data;
62 pb=Lb.data;
63 pa_last=La.data+La.length-1;
64 pb_last=Lb.data+Lb.length-1;
65 Lc.length=La.length+Lb.length;
66 pc=Lc.data=(int *)malloc(Lc.length*sizeof(int));
67 if(!Lc.data)return 0;
68 while(pa<=pa_last)*pc++=*pa++;
69 while(pb<=pb_last)*pc++=*pb++;
70 }
71 int fuzhi(xianxing La,xianxing &Lb){//复制两个线性表
72 int *p,*q;
73 p=La.data;
74 q=Lb.data;
75 for(p;p<=La.data+La.length-1;p++){
76 *q++=*p;
77 }
78 Lb.length=La.length;
79 }
80 int clearList(xianxing &L){
81 L.data=(int *)malloc(ElemNum*sizeof(int));
82 L.length=0;
83 }
84 int getElem(xianxing L,int i,int &e){
85 if(i<1||i>L.length)return 0;
86 int *p;
87 e=*(L.data+i-1);
88 return 1;
89 }
90 int destroyList(xianxing &L){
91 int *p,*q;
92 p=L.data;
93 delete [] p;
94 L.data=NULL;
95 }
96 int main(){
97 /*****************定义一个线性表并输入一串数字,然后存入data.txt文件中*********************/
98 /*
99 xianxing L;//定义相性表L
100 InitList(L);//初始化线性表
101 shuru(L);
102 printf("nn");
103 int *p;
104 FILE *fp;
105 fp=fopen("data.txt","w");
106 for(p=(L.data);p<=L.data+L.length-1;++p){
107 fprintf(fp,"%d ",*p);
108 }
109 fclose(fp);
110 */
111 /**************删除你想要删除的第几位数*****************/
112 /*int m,l=0;
113 printf("输入你想删除的第几位数:");
114 scanf("%d",&l);
115 ListDelete(L,l,m);
116 fprintf(fp,"nn");
117 for(p=(L.data);p<=L.data+L.length-1;++p){
118 fprintf(fp,"%d ",*p);
119 }
120 printf("删除了第%d位数%d",l,m);*/
121
122 /***********************查找想要的数的第一次出现的位置*************************/
123 /*
124 int chazhaoshu=0;
125 printf("输入你想查找的数:");
126 while(scanf("%d",&chazhaoshu)!=EOF){//isalnum判断是不是数字
127 if(isalpha(chazhaoshu)!=0){
128 return 0;
129 }
130 int q;
131 LocateElem(L,chazhaoshu,q);
132 if(q==-1){
133 printf("抱歉没查到那个数的位置n");
134 }else{
135 printf("你想要查找的数出现的第一次位置是在%dn",q);
136 }
137 printf("输入你想查找的数:");
138 }
139 */
140 /*************合并两个线性表****************/
141 /*
142 xianxing La,Lb,Lc;
143 InitList(La);
144 InitList(Lb);
145 InitList(Lc);
146 shuru(La);
147 printf("nn");
148 shuru(Lb);
149 MergeList(La,Lb,Lc);
150 int *lc;
151 for(lc=Lc.data;lc<=Lc.data+Lc.length-1;lc++){//输出合并后的线性表
152 printf("%dn",*(lc));
153 }
154 */
155 /********************复制线性表*************************/
156 /*
157 xianxing La,Lb;
158 InitList(La);
159 InitList(Lb);
160 shuru(La);
161 fuzhi(La,Lb);//执行复制
162 int *p;
163 for(p=Lb.data;p<=Lb.data+Lb.length-1;p++){//输出复制后的线性表
164 printf("%dn",*p);
165 }
166 */
167 /*******************清空线性表**********************/
168 /*
169 xianxing L;
170 InitList(L);
171 shuru(L);
172 printf("%d %d",*(L.data+1),L.length);
173 printf("nn");
174 clearList(L);//清空
175 printf("%d %d",*(L.data+1),L.length);
176 */
177 /*******************根据序号查找元素值***********************/
178 /*
179 xianxing L;
180 InitList(L);
181 shuru(L);
182 int m=0;
183 printf("输入你想要查找第几个元素的值");
184 scanf("%d",&m);
185 int e;
186 if(getElem(L,m,e)){
187 printf("你想要查找的数的值是%d",e);
188 }else{
189 printf("没找到");
190 }
191 */
192 /**********************销毁线性表******************************/
193 xianxing L;
194 InitList(L);
195 shuru(L);
196 printf("%d",*(L.data+1));
197 destroyList(L);
198 //printf("%d",*(L.data+1));去掉注释则运行报错,因为已经销毁了L.data
199 return 0;
200 }
线性表特点:易查询,难增删;要查询一个线性表中某一个元素的值很简单,只要根据索引位置来查询就行,所以时间复杂度是O(1);但是如果要增加或者删除元素,最好的情况时间复杂度是O(1),最坏的情况是O(n);所以平均下来时间复杂度是O(n/2),再简化点就是O(n);所以线性表一般用来存储增删不太频繁的数据。
- 移除 WordPress 后台“外观-主题” 管理功能
- 移除 WordPress 后台插件管理的“编辑”与“停用”功能
- 区域设置 ID (LCID) 表
- jquery 表单事件
- Jexus以.NET(Phalanger)方式支持PHP的网站
- jquery鼠标事件
- Jexus 负载均衡
- 用.NET Framework 2.0创建 Form设计器[翻译]
- jquery事件绑定
- Fontello:免费Web-font 图标大集合(font-face 图标集)
- 通过 wp-config.php 禁止安装、升级或编辑WordPress 主题与插件
- 利用VS2005中的Code Snippets提高开发效率
- 用schemaSpy制作数据库文档
- WordPress 投票插件Post Ratings,可在谷歌搜索显示星级投票(附中文包下载)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【每日一题】【vue2源码学习】VUE中模版编译原理
- 【每日一题】【vue2源码学习】对VUE响应式数据的理解
- ApacheCN 深度学习译文集 2020.9
- 当Docker遇到Intellij IDEA,再次解放了生产力~
- 基于NPOI的Excel导入导出类库
- 在tinycolinux32上装tinycolinux64 kernel和toolchain
- 通过链下签名授权实现更少 Gas 的 ERC20代币
- 在dbcolinux上安装cozy-light
- 在群晖docker上装elmlang可视调试编码器ellie
- Elasticsearch:inverted index,doc_values及source
- 在群晖docker上构建私有云IDE和devops构建链
- 小白学PyTorch | 14 tensorboardX可视化教程
- Apache Solr 漏洞复现
- Elasticsearch rollover API
- 重发和重定向有什么区别与重定向应用