顺序表
选择合适的数据结构 提高算法写的代码的效率
数据 存储和管理
根据数据之间的关系(逻辑结构)
集合 类型相同 但没有关联
线性关系 每个数据唯一的前驱和后继(排队)
树状结构 一对多 树状结构
图 多对多 图
A->B->C-D
数据的存储方式(存储结构)
顺序存储 --->数组 存放元素位置是相邻的
链式存储 数据位置不相邻 可以通过上一个数据找到下一个数据
顺序表 链表/双链表 栈和队列 线性表
顺序表 数据的方式 数组 动态数组
存放若干数据
算法 二分查找
如果有序那么可以有其他的查找方式
无序 只能一个个查找
算法 计算数据
数据结构 存储和管理数据
1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 typedef struct list 5 { 6 int arr[100]; 7 int len;//当前存放的数组个数 8 int size;//数组大小 如果是动态数组 就记得加上size 9 }LIST; 10 void init(LIST*p);//初始化 对顺序表进行操作------->传入地址 结构体指针 11 void insertData(LIST*p,int data);//插入 12 void deleteData(LIST*p,int data);//删除 13 void findData(LIST*p,int data);//查找 14 int main() 15 { 16 int i; 17 LIST mylist;//准备一个顺序表 18 init(&mylist); 19 srand((unsigned)time(NULL)); 20 for (i=0;i<80;++i) 21 { 22 insertData(&mylist,rand()%200); 23 } 24 for (i=0;i<mylist.len;i++) 25 { 26 printf("%d\t",mylist.arr[i]); 27 } 28 getchar(); 29 return 0; 30 } 31 void init(LIST*p) 32 { 33 p->len=0; 34 p->size=100; 35 36 } 37 void insertData(LIST*p,int data) 38 {//头插 尾插 中间插入 39 #if 0 //尾插 40 if (p->len==p->size)//如果插满就不能在插了 41 { 42 return; 43 } 44 p->arr[p->len]=data; 45 p->len++; 46 #else 47 if (p->len==p->size) 48 { 49 return; 50 } 51 int i; 52 i=p->len; 53 while (i-1>=0&&p->arr[i-1]>data) 54 { 55 p->arr[i]=p->arr[i-1]; 56 --i; 57 } 58 p->arr[i]=data; 59 p->len++; 60 #endif 61 } 62 void deleteData(LIST*p,int data) 63 { 64 for (int i=0;i<p->len;++i) 65 { 66 if (p->arr[i]==data)//不止= 区间 大于100小于120 67 { 68 //找到要删除的元素下标 69 for (p->arr[i]==data) 70 { 71 for (int j=i;j<p->len-1;++j) 72 { 73 p->arr[j]=p->arr[j+1]; 74 } 75 p->len;//删除之后 元素个数减一 76 break;//删除一个之后 就可以结束了 77 } 78 } 79 } 80 81 } 82 void findData(LIST*p,int data) 83 { 84 int i; 85 for (i=0;i<p->len;++i)//数据可能有多个 86 { 87 if (p->arr[i]==data) 88 { 89 printf("arr[%d]=%d\n",i,p->arr[i]);//后续可以通过下标 修改 删除 90 } 91 } 92 }