标签:双向 函数名 lib 指针 nbsp code 修改 har class
下边程序实现的是一个双向不循环链表。
#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; }
标签:双向 函数名 lib 指针 nbsp code 修改 har class
原文地址:https://www.cnblogs.com/rivsidn/p/10582995.html