1.链表
链表是线性表的一种,由一系列节点(结点)组成,每个节点包含一个数据域和一个指向下一个节点的指针域。链表结构可以克服数组需要预先知道数据大小的缺点,而且插入和删除元素很方便,但是失去数组随机读取的优点。链表有很多种不同类型:单向链表,双向链表和循环链表。
在链表中第一个节点叫头节点(如果有头节点)头节点不存放有效信息,是为了方便链表的删除和插入操作,第一个有效节点叫首节点,最后一个节点叫尾节点。
2.单向链表(单链表)
单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向表中的下一个节点,而最后一个节点则指向一个空值NULL。
单向链表只可向一个方向遍历。
查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。也可以提前把一个节点的位置另外保存起来,然后直接访问。
//结构
typedef struct _node
{
struct _node *next;
int date;
}node, *list;
//初始化
list init_single_link_list()
{
list link_list = NULL;
link_list = (list)malloc(sizeof(list));
//
if(NULL == link_list){
printf("malloc failed !!\n");
exit(1);
}
//
link_list->next = NULL;
return link_list;
}
//头插法
int insert_to_link_list_head(list list_, int date)
{
list p = NULL;
//
if (NULL == list_)
{
printf("list is NULL ...\n");
exit(1);
}
//
p = (list)malloc(sizeof(list));
//
if(p == NULL)
{
printf("malloc failed \n");
exit(1);
}
//
p->date = date;
p->next = list_->next;
list_->next = p;
return 1;
}
//尾插法实现
int insert_to_link_list_tail(list list_, int date)
{
list p = NULL;
//
if (NULL == list_)
{
printf("list is NULL ...\n");
exit(1);
}
//
p = (list)malloc(sizeof(list));
//
if(NULL == p) {
printf("malloc fialed !\n");
exit(1);
}
//
while(list_->next) //找到尾
{
list_ = list_->next;
}
p->date