双向不循环链表

Posted rivsidn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双向不循环链表相关的知识,希望对你有一定的参考价值。

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

#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;

 

以上是关于双向不循环链表的主要内容,如果未能解决你的问题,请参考以下文章

队列_带有一个尾结点的单向不循环链表实现

数据结构之链表

《链表》之带头双向循环链表

带头双向循环链表 代码实现 review

双向循环链表

C语言教程“双向循环链表”学习总结及其代码实现