1.线性表
概念:
一个线性表是n个具有相同特性的数据元素的有限序列,线性表中数据元素之间的关系是一对一的关系。
特点:
①有且只有一个元素没有前驱元素---首元素/头元素
②有且只有一个元素没有后继元素--尾元素
线性表存储:
连续式存储:用连续的存储单元存储顺序表(数组形式)
不连续性:用不连续的存储单元存储不连续的链表(链式存储)
2.顺序表
概念:
用连续的存储单元存储一个线性表
特点:
①连续的存储单元---采用数组形式
②不改变线性表数据元素的逻辑次序
优点:
①不改变逻辑存储顺序
②地址连续(连续存储),可以通过计算得到任意地址,访存速度快,可以实现随机访问
③要素:首元素地址、单元偏移(下标)
缺点:
①要占据大块的连续空间
②插入删除不方便
3.分配数组
形式:
定义数组:数据类型 数组名[元素个数]
(从高址向低址找,以每个数据类型占据的字节数为一个偏移单位计算,元素个数只能是常量)
int和float均为4字节数据类型
②动态分配地址:
malloc(元素个数*sizeof(数据类型));
返回的地址类型不对是void型的,应该进行强制类型转换
int*p;p = (数据类型*)malloc(元素个数*sizeof(数据类型));
注意:指针a指向数组首元素不动
sizeof里面的数据类型是单元类型,强制类型转换的数据类型后面加了*是单元的地址类型
练习:定义一块有8个元素的整形数组,并输入数据,通过函数AvgArray(int *a)返回数组的平均值
(定义数组可以初始化给值,malloc动态分配内存的数组只能scanf手动输入)
#include<stdio.h> #include<stdlib.h> int main(){ int *a;//定义指针 //分配动态数组 a = (int *)malloc(8*sizeof(int)); int i; for(i=0;i<8;++i){ scanf("%d",a+i); } double AvgArray(int *a,int n){ double result=0.0; for(i=0;i<n;i++){ result += a[i]; } return result/n; } printf("%f\n",AvgArray(a,8)); }
实现:
1.顺序表的查找(顺序查找)
例:设有顺序表Data(无序、无重复值),给定关键字key,在顺序表中查找关键字key的数据元素,若找到返回下标,未找到则返回-1
#include<stdio.h>#include<stdlib.h> intFindElem(int*a,intn,intkey){// int i,n=-1;// for(i=0;i<n;i++){// if(a[i] == key){// n = i;// break;// }// }// return n;// int i;// for(i=0;i<n;){// if(a[i]==key) break;// else i++;// }// if(i<n) return i;// else return -1;// int i;// for(i=0;i<n;i++){// if(a[i]==key) break;// }// if(i<n) return i;// else return -1;// int i;// for(i=0;i<n;i++){// if(a[i]==key) break;// }// return i<n?i:-1;inti;for(i=0;i-1)printf("Yes!\n");elseprintf("No!\n");printf("%d\n",R);return0;}
2.顺序表的删除
例:将顺序表中给定的关键字key的对应的数据元素从顺序表中删除
#include<stdio.h>#include<stdlib.h>int DelKeyElem(int a[],int n,int key){int i,j;for(i=0;i<n&&a[i]!=key;++i);if(i<n){for(j=i;j<n-1;++j){ a[j]=a[j+1]; } n--; } return n; } int main(void){ int Data[8]={2,5,7,8,4,9,10}; int key,n,i; printf("请输入一个数字key:"); scanf("%d",&key); int DelKeyElem(int *a,int n,int key); n = DelKeyElem(Data,7,key); for(i=0;i<n;i++){ printf("%3d",Data[i]); } //free*Data; return 0; }
C语言种输出形式:
%c:单个字符
%x:十六进制整数
%d:十进制整数
%f :十进制浮点数
%o:八进制数
%s :字符串
%u:无符号十进制数
%%:输出百分号%