第十二章 使用结构和指针
这章就是链表。先单链表,后双向链表。
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