第十二章 使用結構和指針
這章就是鏈表。先單鏈表,後雙向鏈表。
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; } } }