C语言抽象数据类型(ADT:abstract data type)之链表节点定义及有序链表插入新节点

链表:包含一些数据的独立的数据结构(通常称为节点)的集合。

单链表

根指针记录链表的起始位置,根指针指向链表的第一个节点,注意根指针只是一个指针,它不包含任何数据

最后一个节点的指针字段值为NULL,提示链表后面不再有任何节点。

用结构体创建一个简单的节点数据结构Node

typedef struct NODE {
        struct NODE *link;
        int          value;
}Node;

插入新节点到有序的单链表

#include 
#include 
#include "sll_node.h"

#define FALSE 0
#define TRUE  1

//register关键字可以将变量放到寄存器,提高速度
//linkp是指向根节点指针root的一个指针
sll_insert( register Node **linkp,int new_value)
{
    register Node *current;
    register Node *new;

    /*
    **寻找正确的插入位置,按序访问链表,直到到达一个值大于或等于新值的节点
    */
    while((current = *linkp) != NULL &&
            current->value < new_value)//这里先要检查当前节点current没到链表结尾不是NULL
       linkp = ¤t->link;         //然后才能去访问current的值
                                       //linkp是根节点的指针可以让值插入到根节点之后
    /*
    **为新节点分配内存,如果分配失败,返回FALSE
    */
    new = (Node *)mallco(sizeof(Node));
    if(new == NULL)
        return FALSE;
    new->value = new_value;

    /*
    **在链表中插入新节点,返回TRUE
    */
    new->link = current;
    *linkp = new;
    return TRUE;
}

双链表

定义节点

typedef struct NODE {
        struct NODE* pre;
        struct NODE* bwd;
        int          value;
}Node;

编写一个函数插入有序的双链表中

#include 
#include 
#include "double_liked_list_node.h"

int dll_insert(register Node * rootp,int value )
{
    register Node *this;
    register Node *next;
    register Node *newnode;

    for(this = rootp; (next = this->fwd)!=NULL; this = next){
        if(next->value == value) return 0;
        if(next->value >  value)    break;
    }
    newnode = (Node*)malloc(sizeof(Node));
    if( newnode == NULL )
         return -1;
    newnode->value = value;

    newnode->fwd = next;
    this->fwd    = newnode;

    if(this != rootp)
        newnode->bwd = this;
    else
        newnode->bwd = NULL;//根指针的值为空只是个指针,
                            //因此newnode是第一个节点的话bwd就是NULL

    if(next != NULL)
        next->bwd = newnode;
    else
        rootp->bwd = newnode;
}

 

你可能感兴趣的:(c,cpp)