链表
链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.
链表中的数据是以节点来表示的.节点是由数据域(data) ,以及指针域(next) 构成.数据域存放数据, 指针域存放的是下一个节点的地址.
链表在内存中存储方式是非连续的,非顺序的.
链式存储结构如下:
typedef struct node_s
{
int data;
struct node_s *next;
} node_t;
队列与栈
队列 :只允许在表的前端进行删除操作,在表的后端进行插入操作的线性表.
栈 :只能在某一端插入和删除的特殊线性表.
简单来说 ,队列是数据先进先出(first in first out,FIFO), 栈是先进后出(first in last out,FILO).
头插法与尾插法
头插与尾插, 简单来说, 新malloc一个节点, 这个节点是插入在头部还是尾部.
链表的free
通过建立一个新指针 freenode, 让freenode 等于 *head(即head指向的节点), 让head等于第二个节点. 这样 就把我们要释放的节点断开, 并保证之后的节点处于链接状态. 不丢失数据. 我们此时释放freenode, 并将freenode 指针指向的空间赋值为NULL.
free函数的实现
void Free(node_t **head)
{
node_t *freenode=NULL;
freenode = *head;
while( *head!=NULL )
{
freenode = *head;
*head = (*head)->next;
free(freenode);
freenode = NULL;
printf("%p\n", freenode); //打印地址来判断释放内存是否完全成功, 即看打印次数
printf("bye\n");
}
return ;
}
通过尾插法实现队列
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Free(node_t **head);
typedef struct node_s
{
int data;
struct node_s *next;
} node_t;
int main (int argc, char **argv)
{
node_t *head = NULL;
node_t *new_node;
node_t *tail;
int i;
//for循环实现尾插法
for(i=0; i<10; i++)
{
new_node = (node_t *)malloc(sizeof(node_t));
memset(new_node, 0, sizeof(node_t) );
new_node->next = NULL;
new_node->data = i+1;
if( head == NULL )
{
head = new_node;
}
else
{
tail->next = new_node;
}
tail = new_node;
new_node->next = head;
head = new_node;
}
{
node_t *node=NULL;
//遍历链表
for(node=head; node!=NULL; node=node->next)
{
printf("%d\n",node->data);
}
}
//释放链表
Free(&head);
return 0;
}
void Free(node_t **head)
{
node_t *freenode=NULL;
freenode = *head;
while( *head!=NULL )
{
freenode = *head;
*head = (*head)->next;
free(freenode);
freenode = NULL;
printf("%p\n", freenode); //打印地址来判断释放内存是否完全成功, 即看打印次数
printf("bye\n");
}
return ;
}
输出结果为:
我们可以观察到一共free十次, 每释放一次就将freenode指针赋值为NULL.
通过头插法实现栈
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node_s
{
int data;
struct node_s *next;
} node_t;
int main (int argc, char **argv)
{
node_t *head = NULL;
node_t *new_node;
int i;
for(i=0; i<10; i++)
{
new_node = (node_t *)malloc(sizeof(node_t));
memset(new_node, 0, sizeof(node_t) );
new_node->next = NULL;
new_node->data = i+1;
new_node->next = head;
head = new_node;
}
{
node_t *node=NULL;
for(node=head; node!=NULL; node=node->next)
{
printf("%d\n",node->data);
}
}
return 0;
}
输出结果为: