链表是一种物理存储单元非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
#include "linklist.h"
#include <stdlib.h>
#include <stdio.h>
//创建头节点
lkl_pnode create_linklist()
{
//创建堆区空间
lkl_pnode H = (lkl_pnode)malloc(sizeof(lkl_node));
if(NULL == H)
{
printf("malloc is default\n");
return NULL;
}
H->next = NULL; //一开始是没有其他节点的,所以头节点指向NULL
return H;
}
//获取链表长度
int getlen_linklist(lkl_pnode H)
{
int count = 0;
while(H->next)
{
H = H->next;
count++;
}
return count;
}
//插入
int insert_linklist(lkl_pnode H, int pos, linklist_data_t data)
{
//判断插入位置是否合法
if(pos < 0 || pos > getlen_linklist(H))
{
printf("pos is default\n");
return -1;
}
//找到插入位置的前一个节点的位置
while(pos--)
{
H = H->next;
}
//插入,头插
lkl_pnode new = create_linklist();
new->data = data;
new->next = H->next;
H->next = new;
return 0;
}
//判空
int empty_linklist(lkl_pnode H)
{
if(H->next == NULL)
return 0;
else
return -1;
}
//打印
int show_linklist(lkl_pnode H)
{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
//遍历
while(H->next)
{
H = H->next;
printf("dat=%d ", H->data);
}
printf("\n");
}
//删除
int delete_linklist(lkl_pnode H, linklist_data_t data); //按值删除
int delete1_linklist(lkl_pnode H, int pos)//按位置删除
{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}