双向不循环链表

下边程序实现的是一个双向不循环链表。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define new(p) ((p) = malloc(sizeof(*(p))))

#define IFNAMSIZ 16

struct interface *int_last, *int_list;

struct interface {
    struct interface *next, *prev;

    char name[IFNAMSIZ];
};


static struct interface *add_interface(char *name)
{
    struct interface *ife, **nextp, *new;

    for (ife = int_last; ife; ife = ife->prev) {
        int n = strcmp(ife->name, name); 
        if (n == 0) 
            return ife; 
        if (n < 0) 
            break; 
    }
    /*宏函数提前展开了。如果函数名跟局部变量名重名,该该局部中函数名会被覆盖*/
    new(new);  
    strncpy(new->name, name, IFNAMSIZ); 
    /*通过二级指针访问指针变量,既可以访问,又可以修改指针变量*/
    nextp = ife ? &ife->next : &int_list;
   /*new初始化*/
new->prev = ife; new->next = *nextp; if (new->next) new->next->prev = new; else int_last = new;
   /*
   * 当nextp不是二级指针的时候,上边的code很容易就能修改,但是下边这句就不能
   * 这么来写了,也就是说,二级指针在既要访问,又要修改某个指针变量的时候效果
   * 很好。
   */
*nextp = new; return new; }
/*
* 分四种情况测试:
* 1.完全没变量时候插入一个元素
* 2.有一个元素时候插入在前边
* 3.有一个元素时候插入在后边
* 4.有两个元素时候插入在中间
*/
int main() { struct interface *ife; add_interface("eth0"); #if 0 add_interface("eth2"); add_interface("eth1"); add_interface("eth4"); add_interface("eth5"); add_interface("eth6"); add_interface("eth9"); #endif for (ife = int_list; ife; ife = ife->next) { printf("ife name %s\n", ife->name); } printf("---------------\n"); for (ife = int_last; ife; ife = ife->prev) { printf("ife name %s\n", ife->name); } return 0; }

猜你喜欢

转载自www.cnblogs.com/rivsidn/p/10582995.html