SPF算法找的是最优路径,下面的代码是在SPF基础上修改,查找的是次优路径
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct listnode {
struct listnode *next;
struct listnode *prev;
void *data;
};
struct list
{
struct listnode *head;
struct listnode *tail;
unsigned long count;
int (*cmp) (void *val1, void *val2);
void (*del) (void *val);
};
#define NEXTNODE(X) ((X) = (X)->next)
#define LISTHEAD(X) ((X)->head)
#define LISTCOUNT(X) (((X) != NULL) ? ((X)->count) : 0)
#define listcount(X) (((X) != NULL) ? ((X)->count) : 0)
#define LIST_ISEMPTY(X) ((X)->head == NULL && (X)->tail == NULL)
#define list_isempty(X) ((X)->head == NULL && (X)->tail == NULL)
#define GETDATA(X) ((X)->data)
/* Prototypes. */
struct list *list_new(void);
void list_free (struct list *);
void listnode_free(struct listnode *node);
struct listnode *listnode_add (struct list *, void *);
struct listnode *listnode_add_sort (struct list *, void *);
struct listnode *listnode_add_before (struct list *, struct listnode *,void *);
int listnode_add_sort_nodup (struct list *, void *);
struct listnode *listnode_add_after (struct list *, struct listnode *, void *);
void *listnode_delete (struct list *, void *);
struct listnode *listnode_lookup (struct list *, void *);
void *listnode_head (struct list *);
void list_delete (struct list *);
void list_delete_all_node (struct list *);
/* For ospfd and ospf6d. */
void list_delete_node (struct list *, struct listnode *);
/* For ospf_spf.c */
void list_add_node_prev (struct list *, struct listnode *, void *);
void list_add_node_next (struct list *, struct listnode *, void *);
void list_add_list (struct list *, struct list *);
/* List iteration macro. */
#define LIST_LOOP(L,V,N) \
if (L)\
for ((N) = (L)->head; (N); (N) = (N)->next) \
if (((V) = (N)->data) != NULL)
/* List node add macro. */
#define LISTNODE_ADD(L,N) \
do { \
(N)->next = NULL; \
(N)->prev = (L)->tail; \
if ((L)->head == NULL) \
(L)->head = (N); \
else \
(L)->tail->next = (N); \
(L)->tail = (N); \
} while (0)
/* List node delete macro. */
#define LISTNODE_DELETE(L,N) \
do { \
if ((N)->prev) \
(N)->prev->next = (N)->next; \
else \
(L)->head = (N)->next; \
if ((N)->next) \
(N)->next->prev = (N)->prev; \
else \
(L)->tail = (N)->prev; \
} while (0)
/********************************************************************************/
/* FUNCTION NAME: list_new */
/* */
/* INPUTS: 1. None */
/* */
/* RETURN: linked list structure */
/* */
/* */
/* NOTE: new list structure */
/* */
/********************************************************************************/
struct list *list_new()
{
struct list *list;
list = (struct list *)malloc(sizeof(struct list));
if (!list)
{
printf("malloc list error\n");
return NULL;
}
memset(list, 0, sizeof(struct list));
return list;
}
/********************************************************************************/
/* FUNCTION NAME: list_free */
/* */
/* INPUTS: 1. list -- list structure */
/* */
/* RETURN: */
/* None */
/* */
/* NOTE: free list structure */
/* */
/********************************************************************************/
void list_free(struct list *list)
{
free(list);
}
/********************************************************************************/
/* FUNCTION NAME: newnode_new */
/* */
/* INPUTS: 1. None */
/* */
/* RETURN: linked list node structure */
/* */
/* */
/* NOTE: new newnode */
/*