数据结构和算法
这周我们主要学习了数据结构这一块,其中包含了栈,队列,链式,树。;链式包含了单向链式,双向链式,通用链式。树包括普通树和二叉树,我们主要学习了二叉树。
其中对我来说比较难理解的就是链式这一块,先来说说单向链式的使用。
在开始创建链式前要先创建结点
.c Node*
creat_node(TYPE data)
{
Nodenode=malloc(sizeof(Node));
node->next=NULL;
node->data=data;
return node;
}
还要构建结点和链式的结构
typedef struct Node { TYPE data; struct node*next; }
Node;
typedef struct List
{
Nodehead;
Node*tail;
size_t size;
}List;
.c
在创建完这些结构之后,开始构建链式的功能,其中比较难理解的几个功能有,头添加,头删除,值删除,位置删除
//头添加
void head_add_list(List*list,TYPE data)
{
Node*node=creat_node(data);
if(0==list->size)
{
list->head=node;
list->tail=node;
}
else
{
node->next=list->head;
list->head=node;
}
list->size++;
}
//尾添加
void tall_add_list(List*list,TYPE data)
{
Node*node=creat_node(data);
if(0==list->size)
{
list->head=node;
list->tail=node;
}
else
{
list->tail->next=node;
list->tail=node;
}
}
//头删除
bool head_del_list(List*list)
{
if(0>=list->size) return false;
Node*node=list->head;
list->head=node->next;
if(1==list->size)
{
list->tail=NULL;
}
free(node);
list->size--;
return true;
}
//尾删除
bool tall_del_list(List*list)
{
if(0>=list->size) return NULL;
if(1==list->size)
{
head_del_list(list);
}
Node*node=list->head;
while(node->next!=list->tail)
{
node=node->next;
}
free(list->tail);
list->tail=node;
node->next=NULL;
list->size--;
return true;
}
//值删除
bool delete_value_list(List*list,TYPE data)
{
if(data==list->head->data)
{
head_del_list(list);
return true;
}
Node*prev=list->head;
while(prev->next!=NULL)
{
if(data==prev->next->data)
{
Node*node=prev->next;
prev->next=node->next;
free(node);
list->size--;
}
prev=prev->next;
}
}
//位置删除
bool delete_index_list(List*list,int index)
{
if(0>index||index>=list->size) return false;
if(1==index)
{
head_del_list(list);
}
else if(index+1==list->size)
tail_del_list(list);
else
{
Node*prev=list->head;
for(int i=0;i<index-1;i++)
{
prev=prev->next;
}
Node*node=prev->next;
prev->next=node->next;
free(node);
list->size--;
}
return true;
}
//插入
bool insert_list(List*list,int index,TYPE data)
{
if(0>index||index>=list->size) return false;
if(0==index)
{
head_add_list(list,data);
return true;
}
else
{
Node*prev=list->head;
for(int i=0;i<index-1;i++)
{
prev=prev->next;
}
Node*node=prev->next;
node->next=prev->next;
prev->next=node;
return true;
}
list->size++;
}