数据结构与算法——链表/队列
链表/队列
在说链表和队列之前,先来看一下数组
数组
数组是一种比较简单的表示一系列有顺序的数据方式 ,而元素所在的位置我们称之为元素的索引,相比于其他方式,数组的特点是使用的内存空间是连续的
数组的操作
//初始化数组
int array[5] = {0,1,2,3,4};
访问元素
//访问 元素
int num = array[2];
std::cout<<"num 2= "<<num<<std::endl;
删除元素
void dele_num(int *array,int length,int num) //数组,数组长度,要删除的位置
{
for(int i = num - 1; i < length; i++) //int i = num - 1; 是因为array[]在计算机里是从0开始排的,如果要删除第一个元素其实就是第0个元素
{
array[i] = array[i+1];
}
遍历数组
void Traversal_array(int *array,int length)
{
for (int i = 0; i < length; i++)
{
std::cout<<array[i];
}
std::cout<<std::endl;
}
查找数组
int find(int *array, int length, int target)
{
for (int i = 0; i < length; i++) {
if (array[i] == target)
return i;
}
return -1;
}
数据也有很多它的局限性,比如我们无法修改它的长度,这导致如果想要在数组中 插入数据会变得很困难。
链表
//创建一个单向链表
typedef struct student
{
int num;
int score;
char name[20];
struct student *next;
};
//双向链表
typedef struct students
{
int num;
int score;
char name[20];
struct students *front;
struct students *next;
};
//添加节点
void link_creat_head(student **p_head,student *p_new)
{
student *p_move = *p_head;
if(*p_head == NULL)
{
*p_head = p_new;
p_new->next = NULL;
}
else
{
while (p_move->next != NULL)
{
p_move = p_move->next;
}
p_move->next = p_new;
p_new->next = NULL;
}
}
//链表遍历,传入链表头的地址
void link_print(student *p_head)
{
student* p_move;
p_move = p_head;
while (p_move->next != NULL) //检查是否到达链表尾节点
{
printf("num=%d score=%d name=%s",p_move->num,p_move->score,p_move->name);
p_move=p_move->next;
}
}
//释放链表
void link_free(student **p_head)
{
student *pb = *p_head;
while (*p_head != nullptr);
{
pb=*p_head;
*p_head = (*p_head)->next;
free(pb);
pb = NULL;
}
}