1.数组
最简单的数据存储结构,连续内存,需要预先分配空间
先来了解一下时间效率:
算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。
时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再关注一个算法的空间复杂度。
一个字节的长度是8位,即八个二进制位,两个字节为一个汉字。 字节的含义: 字节是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。 数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
获取数组的长度:
length = sizeof(array)/sizeof(*array);//表达式1
//length = sizeof(array)/sizeof(array[0]);//表达式2
//length = sizeof(array)/sizeof(int);//表达式3
数组可以根据下标查找元素,时间效率很高
1.动态数组的创建
[cpp] view plain copy
在CODE上查看代码片派生到我的代码片
//动态数组的创建
int cloum, row;
//申请空间
int **a = new int*[cloum];
for (int i = 0; i < cloum; i++)
{
a[i]=new int* [row];
}
另一种方法:
#include<vector.h>
vector<int> v;//新建动态数组
上例利用C++中的stl的vector容器创建数组(新一次的容量都是前一次的两倍)
vector是将元素置于一个动态数组中进行管理的容器
vector可以随机存取元素,支持索引值直接存取,用[]或者at()方法
vector下尾部添加或者删除元素非常快,但在中间或头部插入或者删除元素比较耗时
数组名的含义:
可以理解成数组首地址,在数组遍历如a[i]时都是先找到数组首地址再向后查找得到的。
2.字符串
C/C++中每个字符串均已'\0'结束,每个字符串均有一个额外的长度开销;
1.字符指针可以指向一个字符串。
我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:
char *str = "This is a string.";
是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。
这里要注意字符指针与字符数组之间的区别。例如,有说明语句:
char string[ ]="This is a string.";
此时,string是字符数组,它存放了一个字符串。
字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。不必为str分配内存以及存储字符串内容;
string是一个数组,可以改变数组中保存的内容,在创建时就分配17个字节的空间,初始地址也会分配;
3.链表的操作
每个节点可以分为两部分,数据域和地址域,数据域用来存储相关数据,地址域用来存储下一个节点的地址
如下图:
节点1 地址为 0x90, 存储数据1;
节点2 地址为 0x20,存储数据2;
节点3 地址为 0x40,存储数据3;
节点4 地址为 0x70,存储数据4;
链表的插入、删除
a:链表的插入代码实现:
s->next=p->next;//把p的后继节点设置为s的后继节点
p->next=s;//把s设为p的后继节点
b:链表的删除代码实现:
p=p->next;
p->next=s->next;
创建链表
每创建一个结点,都使该结点成为头结点,这样头结点不断地向前移动,就可以创建一个没有特定头结点的链表。
首先创建的结点,会出现在整个链表的最末端,所以数据的写入是逆序的。
【开始的时候,head要初始化为NULL】
LinkList LinkListCreate(const int n)
{
int i;
LinkList head;
Node *p;
head = NULL;
for(;i<n;i++)
{
p = (Node*)malloc(sizeof(Node));
if(NULL == p)
perror("ERROR");
scanf("%d",&p->data);
p->next = head;
head = p;
}
}