c语言实现一个单向链表,C语言实现一个简单的单向链表list
发布日期:2021-06-24 16:20:57 浏览次数:2 分类:技术文章

本文共 2576 字,大约阅读时间需要 8 分钟。

/*

* list.c

*        Generic linked list implementation.

*        cheungmine

*      Sep. 22, 2007.  All rights reserved.

*/

#include

"

list.h

"

/*

Appends a node to a list

*/

void

list_append_node(list_t

*

in_list, listnode_t

*

node)

{

node

->

next

=

NULL;

if

(in_list

->

head)

{

in_list

->

tail

->

next

=

node;

in_list

->

tail

=

node;

}

else

in_list

->

head

=

in_list

->

tail

=

node;

in_list

->

size

++

;

}

/*

Removes the first node from a list and returns it

*/

listnode_t

*

list_remove_head(list_t

*

in_list)

{

listnode_t

*

node

=

NULL;

if

(in_list

->

head)

{

node

=

in_list

->

head;

in_list

->

head

=

in_list

->

head

->

next;

if

(in_list

->

head

==

NULL)

in_list

->

tail

=

NULL;

node

->

next

=

NULL;

in_list

->

size

--

;

}

assert(in_list

->

size

>=

0

);

return

node;

}

/*

Removes all nodes but for list itself

*/

void

list_remove_all(list_t

*

in_list, pfcb_list_node_free pf)

{

listnode_t

*

node;

while

((node

=

list_remove_head(in_list))){

if

(pf) (

*

pf)(node);

free(node);

}

assert (in_list

->

size

==

0

);

}

/*

Returns a copy of a list_t from heap

*/

list_t

*

list_copy(list_t list)

{

list_t

*

newlist

=

(list_t

*

)malloc (

sizeof

(list_t));

*

newlist

=

list;

return

newlist;

}

/*

Concatenates two lists into first list

*/

void

list_concat(list_t

*

first, list_t

*

second)

{

if

(first

->

head)

{

if

(second

->

head)

{

first

->

tail

->

next

=

second

->

head;

first

->

tail

=

second

->

tail;

}

}

else

*

first

=

*

second;

second

->

head

=

second

->

tail

=

NULL;

first

->

size

+=

second

->

size;

}

/*

Allocates a new listnode_t from heap

*/

listnode_t

*

list_node_create(

void

*

data)

{

listnode_t

*

node

=

(listnode_t

*

)malloc (

sizeof

(listnode_t));

node

->

next

=

NULL;

node

->

data

=

data;

return

node;

}

listnode_t

*

list_key_create(

long

key)

{

listnode_t

*

node

=

(listnode_t

*

)malloc (

sizeof

(listnode_t));

node

->

next

=

NULL;

node

->

key

=

key;

return

node;

}

/*

Allocates a empty list_t from heap

*/

list_t

*

list_create()

{

list_t

*

list

=

(list_t

*

)malloc (

sizeof

(list_t));

list

->

size

=

0

;

list

->

head

=

list

->

tail

=

NULL;

return

list;

}

/*

Frees a empty list_t from heap

*/

void

list_destroy(list_t

*

in_list, pfcb_list_node_free  pf)

{

list_remove_all(in_list, pf);

free(in_list);

}

/*

Gets count of nodes in the list

*/

size_t

list_size(

const

list_t

*

in_list)

{

return

in_list

->

size;

}

/*

Gets node by index 0-based. 0 is head

*/

listnode_t

*

list_node_at(

const

list_t

*

in_list,

int

index)

{

int

i

=

0

;

listnode_t

*

node

=

in_list

->

head;

assert(index

>=

0

&&

index

<

(

int

)in_list

->

size);

while

(i

<

index)

{

node

=

node

->

next;

i

++

;

}

return

node;

}

转载地址:https://blog.csdn.net/weixin_33780516/article/details/117218033 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c语言怎么设置bmp图片,用c语言把bmp格式的彩色图片转换成黑白的
下一篇:五子棋c语言代码判定,c语言 五子棋危险判断 求大神解释啊

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月06日 10时23分23秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章