第十二章 使用结构和指针
这章就是链表。先单链表,后双向链表。
1、提炼后的单链表插入操作
#include "stdlib.h" typedef struct NODE { struct NODE *link; int value; } Node; int sll_int(register Node **linkp, int new_value) { register Node *current; //指向当前节点 register Node *new_node; //指向插入节点 /* ** 寻找正确插入位置,按顺序访问链表,直到有个值大于或等于新值 */ while ((current = current->link) != NULL && current->value < new_value) { linkp = ¤t->link; //移动linkp指向下一个Node的link } /* 分配新的内存,并存到新节点去 */ new_node = (NODE *) malloc (sizeof(NODE)); if (new_node == NULL) { return 0; } new_node->value = new_value; /* 插入新节点 */ new_node->link = current; *linkp = new_node; return 1; }
#include "stdlib.h" typedef struct NODE { struct NODE *fwd; struct NODE *bwd; int value; }Node; int dll_insert(Node *rootp, int value) { /* 把一个值插入到一个双向链表中,rootp是一个指向根节点的指针 value 是插入的新值 返回值:如果已经存在链表中,返回0 如果内存不足导致无法插入,返回-1,成功返回1; */ Node *this_node; Node *next_node; Node *new_node; for (this_node = rootp; next_node != NULL; this_node = next_node ) { if (next_node->value == value) return 0; if (next_node->value < value) break; next_node = next_node->fwd; } /* 为新节点申请内存空间*/ new_node = (Node *) malloc (sizeof(Node)); if (new_node == NULL) return -1; new_node->value = value; /* 插入节点 if 不在链表尾部 then 不在链表起始位置 or 位于链表起始位置 else 在链表尾部 then 不在链表起始位置 or 位于链表起始位置(空链表) */ if (next_node->fwd != NULL) { /*不在链表尾部*/ if (this_node != rootp) { /* 不在链表的头部 */ this_node->fwd = new_node; next_node->bwd = new_node; new_node->bwd = this_node; new_node->fwd = next_node; } else { /* 在链表的头部*/ rootp->fwd = new_node; next_node->bwd = new_node; new_node->bwd = rootp; new_node->fwd = next_node; } } else { /*在链表尾部*/ if (this_node->bwd != rootp) { /* 不在链表的头部 */ new_node->fwd = NULL; new_node->bwd = this_node; this_node->fwd = new_node; rootp->bwd = new_node; } else { /* 在链表的头部*/ new_node->fwd = NULL; new_node->bwd = NULL; rootp->bwd = new_node; rootp->fwd = new_node; } } }
C和指针 (pointers on C)——第十二章:使用结构和指针
原文地址:http://blog.csdn.net/liyakun1990/article/details/38070721