链表接口
链表节点定义
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LINKNODE;
- 1、创建链表并初始化
/*init list*/
LINKNODE *init_linklist(int data_array[], int length)
{
LINKNODE *pListHeader = malloc(sizeof(LINKNODE));
if(NULL == pListHeader)
{
return NULL;
}
pListHeader->data = data_array[0];
pListHeader->next = NULL;
LINKNODE *pListRear = pListHeader;
for(int i = 1; i < length; i++)
{
LINKNODE *pListNew = malloc(sizeof(LINKNODE));
if(NULL == pListNew)
{
return NULL;
}
pListNew->data = data_array[i];
pListNew->next = NULL;
pListRear->next = pListNew;
pListRear = pListNew;
}
return pListHeader;
}
- 2、获取链表长度
/*获取list size*/
int get_list_size(LINKNODE *pListHeader)
{
LINKNODE *pListCurr = pListHeader;
int size = 0;
if(NULL == pListHeader)
{
return -1;
}
while(NULL != pListCurr)
{
pListCurr = pListCurr->next;
size++;
}
return size;
}
- 3、在链表值为value的节点插入新的节点
/*在value = old 的位置,插入值为newValue节点*/
int insert_linklist_node_by_value(LINKNODE *pListHeader, int oldValue, int newValue)
{
LINKNODE *pNodePre = NULL;
LINKNODE *pNodeCurr = NULL;
LINKNODE *pNodeNew = NULL;
if(NULL == pListHeader)
{
return -1;
}
pNodePre = pListHeader;
pNodeCurr = pListHeader;
while(NULL != pNodeCurr)
{
if(pNodeCurr->data == oldValue)
{
break;
}
pNodePre = pNodeCurr;
pNodeCurr = pNodeCurr->next;
}
if(NULL == pNodeCurr)
{
return 0;
}
pNodeNew = malloc(sizeof(LINKNODE));
if(NULL == pNodeCurr)
{
return -1;
}
pNodeNew->data = newValue;
pNodePre->next = pNodeNew;
pNodeNew->next = pNodeCurr;
return 1;
}
- 4、在链表中的pos节点位置插入
/*在list的pos位置插入value*/
int insert_linklist_node_by_pos(LINKNODE *pListHeader, int pos, int value)
{
LINKNODE *pListCurr = NULL;
LINKNODE *pListNew = NULL;
if(NULL == pListHeader)
{
return -1;
}
if(pos < 0 || pos > get_list_size(pListHeader))
{
return 0;
}
pListCurr = pListHeader;
for(int i = 0; i < pos; i++)
{
pListCurr = pListCurr->next;
}
pListNew = malloc(sizeof(LINKNODE));
if(NULL == pListNew)
{
return -1;
}
pListNew->data = value;
pListNew->next = pListCurr->next;
pListCurr->next = pListNew;
return 1;
}
- 5、删除链表中值为value的节点
/* 删除list中值为value的节点*/
int del_linklist_node_by_value(LINKNODE *pListHeader, int value)
{
LINKNODE *pListCurr = NULL;
LINKNODE *pListPre = NULL;
if(NULL == pListHeader)
{
return -1;
}
pListCurr = pListHeader;
pListPre = pListHeader;
while(NULL != pListCurr)
{
if(pListCurr->data == value)
{
break;
}
pListPre = pListCurr;
pListCurr = pListCurr->next;
}
if(NULL == pListCurr)
{
return 0;
}
pListPre->next = pListCurr->next;
free(pListCurr);
pListCurr = NULL;
return 1;
}
- 6、删除链表中pos位置节点
/*删除list中pos位置节点*/
int del_linklist_node_by_pos(LINKNODE *pListHeader, int pos)
{
LINKNODE *pListCurr = NULL;
LINKNODE *pListPre = NULL;
if(NULL == pListHeader)
{
return -1;
}
if(pos < 0 || pos > get_list_size(pListHeader))
{
return 0;
}
pListCurr = pListHeader;
for(int i = 0; i < pos; i++)
{
pListPre = pListCurr;
pListCurr = pListCurr->next;
}
pListPre->next = pListCurr->next;
free(pListCurr);
pListCurr = NULL;
return 1;
}
- 7、销毁释放链表内存
/*销毁List*/
int destory_linklist(LINKNODE *pListHeader)
{
LINKNODE *pListCurr = NULL;
LINKNODE *pListNext = NULL;
if(NULL == pListHeader)
{
return -1;
}
pListCurr = pListHeader;
while(NULL != pListCurr)
{
pListNext = pListCurr->next;
free(pListCurr);
pListCurr = pListNext;
}
return 1;
}
- 8、反转链表
/*反转list*/
int reverse_list(LINKNODE **pListHeader)
{
LINKNODE *pListCurr = NULL;
LINKNODE *pListPre = NULL;
LINKNODE *pListNext = NULL;
if(NULL == pListHeader)
{
return -1;
}
pListCurr = *pListHeader;
while(NULL != pListCurr)
{
pListNext = pListCurr->next;
pListCurr->next = pListPre;
pListPre = pListCurr;
pListCurr = pListNext;
}
*pListHeader = pListPre;
return 1;
}
- 9、遍历print链表
void print_list(LINKNODE *pListHeader)
{
LINKNODE *pListCurr = NULL;
if(NULL == pListHeader)
{
printf("list is null\n");
return;
}
printf("listnode: ");
pListCurr = pListHeader;
while(NULL != pListCurr)
{
printf("%d ", pListCurr->data);
pListCurr = pListCurr->next;
}
printf("\n");
}