⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linklist.c

📁 大名鼎鼎的路由器源码。程序分ZEBRA、OSPFRIP等3个包。程序框架采用一个路由协议一个进程的方式
💻 C
字号:
/* Generic linked list routine. * Copyright (C) 1997, 2000 Kunihiro Ishiguro * * This file is part of GNU Zebra. * * GNU Zebra is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2, or (at your option) any * later version. * * GNU Zebra is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Zebra; see the file COPYING.  If not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */#include <zebra.h>#include "linklist.h"#include "memory.h"/* Allocate new list. */struct list *list_new (){  struct list *new;  new = XMALLOC (MTYPE_LINK_LIST, sizeof (struct list));  memset (new, 0, sizeof (struct list));  return new;}/* Free list. */voidlist_free (struct list *l){  XFREE (MTYPE_LINK_LIST, l);}/* Allocate new listnode.  Internal use only. */static struct listnode *listnode_new (){  struct listnode *node;  node = XMALLOC (MTYPE_LINK_NODE, sizeof (struct listnode));  memset (node, 0, sizeof (struct listnode));  return node;}/* Free listnode. */static voidlistnode_free (struct listnode *node){  XFREE (MTYPE_LINK_NODE, node);}/* Add new data to the list. */voidlistnode_add (struct list *list, void *val){  struct listnode *node;  node = listnode_new ();  node->prev = list->tail;  node->data = val;  if (list->head == NULL)    list->head = node;  else    list->tail->next = node;  list->tail = node;  list->count++;}/* Add new node with sort function. */voidlistnode_add_sort (struct list *list, void *val){  struct listnode *n;  struct listnode *new;  new = listnode_new ();  new->data = val;  if (list->cmp)    {      for (n = list->head; n; n = n->next)	{	  if ((*list->cmp) (val, n->data) < 0)	    {	    	      new->next = n;	      new->prev = n->prev;	      if (n->prev)		n->prev->next = new;	      else		list->head = new;	      n->prev = new;	      list->count++;	      return;	    }	}    }  new->prev = list->tail;  if (list->tail)    list->tail->next = new;  else    list->head = new;  list->tail = new;  list->count++;}voidlistnode_add_after (struct list *list, struct listnode *pp, void *val){  struct listnode *nn;  nn = listnode_new ();  nn->data = val;  if (pp == NULL)    {      if (list->head)	list->head->prev = nn;      else	list->tail = nn;      nn->next = list->head;      nn->prev = pp;      list->head = nn;    }  else    {      if (pp->next)	pp->next->prev = nn;      else	list->tail = nn;      nn->next = pp->next;      nn->prev = pp;      pp->next = nn;    }}/* Delete specific date pointer from the list. */voidlistnode_delete (struct list *list, void *val){  struct listnode *node;  for (node = list->head; node; node = node->next)    {      if (node->data == val)	{	  if (node->prev)	    node->prev->next = node->next;	  else	    list->head = node->next;	  if (node->next)	    node->next->prev = node->prev;	  else	    list->tail = node->prev;	  list->count--;	  listnode_free (node);	  return;	}    }}/* Return first node's data if it is there.  */void *listnode_head (struct list *list){  struct listnode *node;  node = list->head;  if (node)    return node->data;  return NULL;}/* Delete all listnode from the list. */voidlist_delete_all_node (struct list *list){  struct listnode *node;  struct listnode *next;  for (node = list->head; node; node = next)    {      next = node->next;      if (list->del)	(*list->del) (node->data);      listnode_free (node);    }  list->head = list->tail = NULL;  list->count = 0;}/* Delete all listnode then free list itself. */voidlist_delete (struct list *list){  struct listnode *node;  struct listnode *next;  for (node = list->head; node; node = next)    {      next = node->next;      if (list->del)	(*list->del) (node->data);      listnode_free (node);    }  list_free (list);}/* Lookup the node which has given data. */struct listnode *listnode_lookup (struct list *list, void *data){  listnode node;  for (node = list->head; node; nextnode (node))    if (data == getdata (node))      return node;  return NULL;}/* Delete the node from list.  For ospfd and ospf6d. */voidlist_delete_node (list list, listnode node){  if (node->prev)    node->prev->next = node->next;  else    list->head = node->next;  if (node->next)    node->next->prev = node->prev;  else    list->tail = node->prev;  list->count--;  listnode_free (node);}/* ospf_spf.c */voidlist_add_node_prev (list list, listnode current, void *val){  struct listnode *node;  node = listnode_new ();  node->next = current;  node->data = val;  if (current->prev == NULL)    list->head = node;  else    current->prev->next = node;  node->prev = current->prev;  current->prev = node;  list->count++;}/* ospf_spf.c */voidlist_add_node_next (list list, listnode current, void *val){  struct listnode *node;  node = listnode_new ();  node->prev = current;  node->data = val;  if (current->next == NULL)    list->tail = node;  else    current->next->prev = node;  node->next = current->next;  current->next = node;  list->count++;}/* ospf_spf.c */voidlist_add_list (struct list *l, struct list *m){  struct listnode *n;  for (n = listhead (m); n; nextnode (n))    listnode_add (l, n->data);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -