数据结构
1.定义
一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)
程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,
并在此基础上实现某个特定的功能的操作;
程序 = 数据结构 + 算法
2.数据与数据之间的关系
数据的逻辑结构:数据元素与元素之间的关系
集合:关系平等
线性结构:元素之间一对一的关系(表(数组,链表),队列。栈。。。)
树型结构:元素之间一对多的关系(二叉树)
图形结构:元素之间多对多的关系(网状结构)
数据的物理结构:数据的逻辑结构在计算机内存中的存储形式
顺序存储:采用一段连续的内存空间保存元素
优点:空间连续,访问方便
缺点:插入删除需要移动大量的元素; 需要预分配内存空间;容易造成存储空间碎片
链式存储:采用一组非连续的内存空间保存元素
缺点:访问元素效率低
优点:插入和删除数据方便;不需要预分配内存
索引存储:通过关键字构建索引表,通过索引表来来找到数据的存储位置
散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对应关系从而实现查找的存储方式;
/******************************
*功能:创建一个链表对象
*返回值:
* 成功:返回链表对象地址
* 失败:NULL
* ***************************/
Link_t *create_link()
{
Link_t *plink = malloc(sizeof(Link_t));
if (NULL == plink)
{
perror("fail malloc");
return NULL;
}
plink->phead = NULL;
plink->clen = 0;
return plink;
}
/***************************************
*功能:向链表头部插入一个数据
*参数:
* plink:链表对象指针
* data : 要插入的数据
*返回值:
* 成功:0
* 失败:-1
* *************************************/
int push_link_head(Link_t *plink, DataType data)
{
Link_Node_t *pnode = malloc(sizeof(Link_Node_t));
if (NULL == pnode)
{
perror("fail malloc");
return -1;
}
pnode->data = data;
pnode->pnext = NULL;
pnode->pnext = plink->phead;
plink->phead = pnode;
plink->clen++;
return 0;
}
void link_for_each(Link_t *plink)
{
Link_Node_t *p = plink->phead;
while (p != NULL)
{
printf("%d ", p->data);
p = p->pnext;
}
printf("\n");
}
int is_empty_link(Link_t *plink)
{
return NULL == plink->phead;
}
int push_link_tail(Link_t *plink, DataType data)
{
Link_Node_t *pnode = malloc(sizeof(Link_Node_t));
if (NULL == pnode)
{
perror("fail malloc");
return -1;
}
pnode->data = data;
pnode->pnext = NULL;
if (is_empty_link(plink))
{
plink->phead = pnode;
}
else
{
Link_Node_t *p = plink->phead;
while (p->pnext != NULL)
{
p = p->pnext;
}
p->pnext = pnode;
}
plink->clen++;
return 0;
}
int pop_link_head(Link_t *plink)
{
if (is_empty_link(plink))
{
return 0;
}
Link_Node_t *pdel = plink->phead;
plink->phead = pdel->pnext;
free(pdel);
plink->clen--;
return 1;
}
int pop_link_tail(Link_t *plink)
{
if (is_empty_link(plink))
{
return 0;
}
else if (1 == plink->clen)
{
pop_link_head(plink);
}
else
{
Link_Node_t *p = plink->phead;
while (p->pnext->pnext != NULL)
{
p = p->pnext;
}
free(p->pnext);
p->pnext = NULL;
plink->clen--;
}
return 1;
}