次优路径算法

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                                                  */
/*                     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值