#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
typedef struct test_list_item
{
struct test_list_item *next;
}test_list_item_t;
typedef struct
{
test_list_item_t *head;
test_list_item_t *tail;
int list_num;
}test_list_t;
//添加的具体数据
typedef struct test_dev_info{
struct test_dev_info *next;
char dev_handle;
char dev_name[8];
}test_dev_info_t;
//申明和定义链表
test_list_t gv_list;
int test_add_item_to_head(test_list_t *list,test_list_item_t *item)
{
if(NULL == item)
return -1;
//添加到头节点
printf("add item %p\n",item);
/*head为空的时候 整个链表还为空,所以需要给尾也赋值*/
if(NULL == list->head)
list->tail = item;
//头节点给要插入的节点next
item->next = list->head;
//插入的节点重新作为头节点
list->head = item;
list->list_num++;
return 0;
}
int test_add_item_to_tail(test_list_t *list,test_list_item_t *item)
{
if(NULL == item)
return -1;
//尾插
if(NULL == list->tail)
{
//说明链表为空
list->head = item;
}
else
list->tail->next = item; //将最后一个节点item和链表链到一起
list->tail = item; //然后记录item为尾部节点
list->list_num++;
printf("add node tail %p ok\n",item);
return 0;
}
int test_delete_item_from_list(test_list_t *list,test_list_item_t *item)
{
//delete node item from list
if(NULL == item || NULL == list->head)
return -1;
//需要考虑删除的是头尾或者中间节点
//如果是头节点
if(list->head == item)
{
//需要将节点后移
list->list_num--;
list->head = item->next;
//也可是
//list->head = list->head->next;
if(NULL == list->head)
list->tail == NULL;
}
//查找链表
//删除节点。
test_list_item_t *list_node_ptr;
test_list_item_t *delete_node_ptr = NULL;
for(list_node_ptr = list->head;list_node_ptr->next!=NULL;list_node_ptr = list_node_ptr->next)
{
if(item == list_node_ptr->next)
{
//delete node 摘除节点
delete_node_ptr = list_node_ptr;
break;
}
}
if(delete_node_ptr)
{
list->list_num--;
//也可以是delete_node_ptr->next = NULL;
delete_node_ptr->next = item->next;
if(list->tail == item)
list->tail = delete_node_ptr;
printf("delete %p ok\n",item);
}
return 0;
}
int test_check_list_item(test_list_t *list,test_dev_info_t *item)
{
test_dev_info_t *dev_list_item = (test_dev_info_t*)list->head;
for(;dev_list_item!= NULL;dev_list_item = dev_list_item->next)
{
printf("item %p dev_list_item %p\n",item,dev_list_item);
if(item == dev_list_item)
{
printf("find devname %s ok!\n",dev_list_item->dev_name);
}
else
{
printf("not find dev_info\n");
}
}
}
int main()
{
test_dev_info_t *dev_info = NULL;
//申请链表需要添加的节点信息的内存
dev_info = (test_dev_info_t *)malloc(sizeof(test_dev_info_t));
if(NULL == dev_info)
printf("malloc fail\n");
//初始化节点信息
memset(dev_info,0,sizeof(test_dev_info_t));
memcpy(dev_info->dev_name,"name1",sizeof("name1"));
dev_info->dev_handle = 1;
//添加到链表中
test_add_item_to_head(&gv_list,(test_list_item_t*)dev_info);
/*
* 添加第二个节点
* 1、申请节点内存,
* 2、初始化以及赋值
* 3、添加到链表中
*/
test_dev_info_t *dev_info2 = NULL;
dev_info2 = (test_dev_info_t *)malloc(sizeof(test_dev_info_t));
if(NULL == dev_info2)
printf("malloc fail\n");
memset(dev_info2,0,sizeof(test_dev_info_t));
memcpy(dev_info2->dev_name,"name2",sizeof("name2"));
test_add_item_to_head(&gv_list,(test_list_item_t*)dev_info2);
//查找节点信息
test_check_list_item(&gv_list,dev_info);
test_delete_item_from_list(&gv_list,(test_list_item_t*)dev_info);
//free(dev_info); //删除需要free调,但是此例子后面还在使用这个指针测试,所以没有free
test_check_list_item(&gv_list,dev_info);
test_add_item_to_tail(&gv_list,(test_list_item_t*)dev_info);
test_check_list_item(&gv_list,dev_info);
return 0;
}
单链表的插入和删除实例
最新推荐文章于 2024-01-10 22:31:51 发布