H文件
#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define databytes int
//typedef int databytes;
typedef struct linklist_node_t
{
union
{
int len;
databytes data;
}msg;
//struct linklist_node_t *prev;
struct linklist_node_t *next;
}linklist_t;
linklist_t *linklist_create(void);
void linklist_tail_insert(linklist_t *head, databytes data);
void linklist_head_insert(linklist_t *head, databytes data);
void linklist_insert_after(linklist_t *p, databytes data);
void show_linklist(linklist_t *head);
void delete_one_linklist(linklist_t *head, databytes data);
void delete_tail_linklist(linklist_t *head);
void delete_head_linklist(linklist_t *head);
void delete_linklist_where(linklist_t *head, int pos);
void togging_linklist(linklist_t *head);
void delete_all_linklist(linklist_t *head);
#endif
C文件
#include "/mnt/share/data/linklist/linklist.h"
/*
* @brief 创建一个链表
* @return 链表头指针
*/
linklist_t *linklist_create(void)
{
linklist_t *head = (linklist_t *)malloc(sizeof(linklist_t));
if(head == NULL)
{
printf("malloc failed\n");
return NULL;
}
head->next = NULL;//初始化链表为空
// head->prev = NULL;
printf("成功创建一个新的链表,头指针为%p\n", head);
return head;
}
/*
* @brief 向链表的头部添加一个节点
* @param head 链表头指针
* @param data 节点数据
*/
void linklist_head_insert(linklist_t *head, databytes data)
{
linklist_t *new_node = (linklist_t *)malloc(sizeof(linklist_t));
linklist_t *p = head->next;
if(new_node == NULL)
{
printf("malloc failed\n");
return;
}
new_node->msg.data = data;//添加节点数据
head->msg.len++;//链表长度加1
new_node->next = head->next;//将新节点的next指针指向原链表的头节点
head->next = new_node;//将原链表的头节点的next指针指向新节点
printf("成功向链表头部添加一个节点,首地址由%p变为%p\n", p, new_node);
}
/*
* @brief 向链表的尾部添加一个节点
* @param head 链表头指针
* @param data 节点数据
* @return 新节点指针
*/
void linklist_tail_insert(linklist_t *head, databytes data)
{
linklist_t *new_node = (linklist_t *)malloc(sizeof(linklist_t));
if(new_node == NULL)
{
printf("malloc failed\n");
return ;
}
head->msg.len++;
while(head->next != NULL)
{
head = head->next;
}
new_node->msg.data = data;
new_node->next = NULL;
head->next = new_node;
printf("成功向链表尾部添加一个节点,%p\n",new_node);
}
/*
* @brief 在链表的某个节点后插入一个新节点
* @param head 链表头指针
* @param p 链表某个节点指针
* @param data 新节点数据
* @return 新节点指针
*/
void linklist_insert_after(linklist_t *p, databytes data)
{
linklist_t *new_node = (linklist_t *)malloc(sizeof(linklist_t));
if(new_node == NULL)
{
printf("malloc failed\n");
return;
}
new_node->msg.data = data;
new_node->next = p->next;
p->next = new_node;
printf("成功在节点%p后插入一个新节点,新节点地址为%p\n", p, new_node);
}
/**
* @brief 根据位置删除链表中的节点
* @param head 链表头指针
* @param pos 要删除的节点位置
* @return 0表示成功,-1表示失败
*/
void linklist_insert_wherer(linklist_t *head, databytes data, int pos)
{
int len = head->msg.len;
if(pos<0 && pos>len-1)
{
printf("插入位置不合法\n");
return;
}
if(pos == len-1)
{
linklist_tail_insert(head, data);
}
else if(pos == 0)
{
int i = 0;
linklist_t *p = head->next;
linklist_insert_after(p, data);
}
else
{
int i = 0;
linklist_t *p = head->next;
while(i<pos-1)
{
p = p->next;
i++;
}
linklist_insert_after(p, data);
}
}
/*
* @brief 显示链表中的数据
* @param head 链表头指针
*/
void show_linklist(linklist_t *head)
{
int i = 0;
while(head->next!= NULL)
{
i++;
printf("No.%d\tdata:%d\n", i,(head->next)->msg.data);
head = head->next;
}
}
/*
* 根据内容删除节点
* @brief 删除链表中的一个节点
* @param head 链表头指针
* @param data 节点数据
*/
void delete_one_linklist(linklist_t *head, databytes data)
{
linklist_t *p = head,*dhead = head;
while(head->next!= NULL && head->next!=p)
{
if((head->next)->msg.data == data)
{
linklist_t *tmp = head->next;
head->next = tmp->next;
free(tmp);
dhead->msg.len--;
printf("删除数据:%d的节点:%p成功\n", data, tmp);
return;
}
head = head->next;
}
printf("链表中没有该数据\n");
}
void delete_linklist_where(linklist_t *head, int pos)
{
int len = head->msg.len;
linklist_t *dhead = head;
if(pos<0 && pos>len-1)
{
printf("删除位置不合法\n");
return;
}
if(pos == 0)
{
head->msg.len--;
delete_head_linklist(head);
}
else if(pos == len-1)
{
head->msg.len--;
delete_tail_linklist(head);
}
else
{
int i = 0;
linklist_t *p = head->next;
while(i<pos-1)
{
p = p->next;
i++;
}
delete_one_linklist(head, p->msg.data);
}
}
/*
* @brief 删除链表的头节点
* @param head 链表头指针
*/
void delete_head_linklist(linklist_t *head)
{
linklist_t *p = head->next;
head->next = p->next;
head->msg.len--;
free(p);
printf("删除头节点成功\n");
}
/*
* @brief 删除链表的尾节点
* @param head 链表头指针
*/
void delete_tail_linklist(linklist_t *head)
{
linklist_t *p = head;
while(head->next->next!= NULL)
{
p = head->next;
head = head->next;
}
free(p->next);
head->msg.len--;
p->next = NULL;
printf("删除尾节点成功\n");
}
/*
* @brief 删除链表中的所有节点
* @param head 链表头指针
*/
void delete_all_linklist(linklist_t *head)
{
linklist_t *p = head->next;
while(p->next!= NULL)
{
linklist_t *tmp = p->next;
free(p);
p = tmp;
}
free(p);
}
/*
* @brief 翻转链表
* @param head 链表头指针
*/
void togging_linklist(linklist_t *head)
{
linklist_t *p = head->next;
while(p->next!= NULL)
{
linklist_t *tmp = p->next;
p->next = tmp->next;
tmp->next = head->next;
head->next = tmp;
}
}