选择合适的数据结构 提高算法写的代码的效率
数据 存储和管理
根据数据之间的关系(逻辑结构)
集合 类型相同 但没有关联
线性关系 每个数据唯一的前驱和后继(排队)
树状结构 一对多 树状结构
图 多对多 图
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 }