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