带头尾指针的list的C实现
来源:互联网 发布:lte优化 编辑:程序博客网 时间:2024/06/07 07:04
一、缘起
很早写了一个带头尾指针的list,该list支持从尾部插入元素,在任意位置删除元素,最近用这个list时发现一个bug,修正了,并加了几个接口函数。贴出来,希望对C的初学者有用。
二、基本说明
2.1、数据结构
l listnode
typedef struct listnode
{
int data; //you can add any type data here
int id;
struct listnode* next;
} *listnode, _listnode;
其中data、id用于测试程序,可换成任意数据类型。
l list
typedef struct list
{
struct listnode* head;
struct listnode* tail;
int count; //0 --empty
int current_id;
} *list, _list;
head、tail均指向实际元素,list为空时,指向NULL,current_id用于测试程序,可去。
2.2、函数说明
l void list_init(list)
初始化list
l void list_insert(list, listnode)
list的尾部插入元素
l int list_delete(list, listnode)
从list上删除指定元素,删除成功返回1,删除失败返回0
l void list_poll(list myroot)
遍历整个pool,测试用
l listnode new_listnode(const int id, int data)
构建新的元素,并为其分配内存
l void delete_listnode(listnode mylistnode)
删除指定元素,并释放其内存
l listnode find_node_by_data(list myroot, const int data)
根据data在list上查找匹配的元素
l listnode find_node_by_id(list myroot, const int id)
根据id在list上查找匹配的元素
三、代码
3.1、list.h:
/* list.h
** Copyright 2004 Coon Xu.
** Author: Coon Xu
** Date: 02 Feb 2005
*/
#ifndef LIST_H
#define LIST_H
#include <stdio.h>
#include <stdlib.h>
typedef struct listnode
{
int data; //you can add any type data here
int id;
struct listnode* next;
} *listnode, _listnode;
typedef struct list
{
struct listnode* head;
struct listnode* tail;
int count; //0 --empty
int current_id;
} *list, _list;
void list_init(list);
void list_insert(list, listnode);
int list_delete(list, listnode);
void list_poll(list myroot);
listnode new_listnode(const int id, int data);
void delete_listnode(listnode mylistnode);
listnode find_node_by_data(list myroot, const int data);
listnode find_node_by_id(list myroot, const int id);
#endif
3.2、list.c:
/* list.c
** Copyright 2004 Coon Xu.
** Author: Coon Xu
** Date: 02 Feb 2005
*/
#include "list.h"
void list_init(list myroot)
{
myroot->count = 0;
myroot->head = NULL;
myroot->tail = NULL;
myroot->current_id = 1;
}
void list_poll(list myroot)
{
printf("-------------------------------------------------------/n");
listnode p_listnode = myroot->head;
while(p_listnode != NULL)
{
printf("id: %d/t data: %d/n", p_listnode->id, p_listnode->data);
p_listnode = p_listnode->next;
}
}
//insert node at the tail
void list_insert(list myroot, listnode mylistnode)
{
myroot->count++;
mylistnode->next = NULL;
if(myroot->head == NULL)
{
myroot->head = mylistnode;
myroot->tail = mylistnode;
}
else
{
myroot->tail->next = mylistnode;
myroot->tail = mylistnode;
}
printf("[insert]:/tlist.cout:/t%d/n", myroot->count);
}
int list_delete(list myroot, listnode mylistnode)
{
struct listnode* p_listnode = myroot->head;
struct listnode* pre_listnode;
//myroot is empty
if(p_listnode == NULL)
{
return 0;
}
//delete head node
if(p_listnode == mylistnode)
{
myroot->count--;
//myroot has only one node
if(myroot->tail == mylistnode)
{
myroot->head = NULL;
myroot->tail = NULL;
}
else
{
myroot->head = p_listnode->next;
}
printf("[delete]:/tlist.cout:/t%d/n", myroot->count);
return 1;
}
while(p_listnode != NULL)
{
if(p_listnode == mylistnode)
{
break;
}
pre_listnode = p_listnode;
p_listnode = p_listnode->next;
}
if(p_listnode == NULL)
{
printf("can not find the node.../n");
return 0;
}
else
{
pre_listnode->next = p_listnode->next;
if(myroot->tail == p_listnode)
{
myroot->tail = pre_listnode;
}
myroot->count--;
printf("[delete]:/tlist.cout:/t%d/n", myroot->count);
return 1;
}
}
listnode new_listnode(const int id, int data)
{
listnode p_listnode = malloc(sizeof(_listnode));
p_listnode->id = id;
p_listnode->data = data;
return p_listnode;
}
void delete_listnode(listnode mylistnode)
{
mylistnode->next = NULL;
free(mylistnode);
mylistnode = NULL;
}
listnode find_node_by_data(list myroot, const int data)
{
listnode p_listnode = myroot->head;
while(p_listnode != NULL)
{
if( p_listnode->data == data )
{
printf("find the node for data: %d/n", data);
break;
}
p_listnode = p_listnode->next;
}
return p_listnode;
}
listnode find_node_by_id(list myroot, const int id)
{
listnode p_listnode = myroot->head;
while(p_listnode != NULL)
{
if( p_listnode->id == id )
{
printf("find the node for id: %d/n", id);
break;
}
p_listnode = p_listnode->next;
}
return p_listnode;
}
3.3、附一个测试的主程序
main.c:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main(int argc, char *argv[])
{
list mylist = malloc(sizeof(_list));
list_init(mylist);
int ix = 0;
for(ix = 0; ix < 10; ix++)
{
listnode my_listnode = new_listnode( (mylist->current_id)++, ix);
list_insert(mylist, my_listnode);
}
list_poll(mylist);
//delete head node and test
listnode my_listnode = find_node_by_id(mylist, 1);
list_delete(mylist, my_listnode);
delete_listnode(my_listnode);
list_poll(mylist);
//insert a node and test
my_listnode = new_listnode( (mylist->current_id)++, 100);
list_insert(mylist, my_listnode);
list_poll(mylist);
//delete tail node and test
my_listnode = find_node_by_id(mylist, 10);
list_delete(mylist, my_listnode);
delete_listnode(my_listnode);
list_poll(mylist);
//insert a node and test
my_listnode = new_listnode( (mylist->current_id)++, 200);
list_insert(mylist, my_listnode);
list_poll(mylist);
//delete a normal node and test
my_listnode = find_node_by_data(mylist, 6);
list_delete(mylist, my_listnode);
delete_listnode(my_listnode);
list_poll(mylist);
//insert a node and test
my_listnode = new_listnode( (mylist->current_id)++, 300);
list_insert(mylist, my_listnode);
list_poll(mylist);
//delete head node again and test
my_listnode = find_node_by_id(mylist, 2);
list_delete(mylist, my_listnode);
delete_listnode(my_listnode);
list_poll(mylist);
//insert a node and test
my_listnode = new_listnode( (mylist->current_id)++, 400);
list_insert(mylist, my_listnode);
list_poll(mylist);
system("PAUSE");
return 0;
}
- 带头尾指针的list的C实现
- Python 实现带头尾指针的单向链表
- 带链表头指针和尾指针的 list 模板实现
- 带头尾和动画的下拉刷新RecyclerView
- 双向链表容器list的头尾中,全部删除
- Container With Most Water (头尾指针的妙用)
- 循环队列的头尾指针----阿里巴巴2015实习生笔试题
- list 的c实现
- android 实现类似知乎 上推隐藏头尾 下拉出现头尾的Demo
- 头尾指针
- 带指针的【七彩时钟】(C语言)
- Android实现带图片的List列表
- 带引用计数的智能指针实现
- Jquery实现图片左右滚动,没有头尾的,一直循环
- c++ String去除头尾空格的方法 trim实现
- 【C++】智能指针的实现
- [c++]智能指针的实现
- 二进制字符串的头尾调转
- XML的简单复习
- Belief
- MongoDB 数组的定位修改器的使用
- String 是不能修改的但是这个出错
- PCWorld盘点2011科技界15大败笔 索尼居首(图)
- 带头尾指针的list的C实现
- 流媒体技术 - adobe flash media server 体验
- 在远特(讯业)的时光……
- 比较int与double型的大小和整数除int与double结果
- 安装Python 的包管理工具
- 关于Q+平台的一些思考
- linux学习 第二天
- SEO教程之教你学会打造高质量的外链
- android博客