C和C指针小记(十七)-使用结构和指针

1、链表

链表(linked list)即使是一些包含数据的独立数据结构的(Node)集合.
链表中的每个节点通过链或指针链接在一起.
程序通过指针访问链表中的节点.
节点通常是动态分配的,但也有由节点数组构建的链表(即使这样,程序也是通过指针来遍历链表).

1.1 单链表

单链表中,每个节点包含一个指向链表下一节点的指针.链表最后一个节点的指针字段的值为NULL.提示链表后面不再有其他节点.
根指针,根指针指向链表的第一个节点,根指针只是一个指针,不包含任何数据.

//但链表节点的结构
typedef struct NODE {
    struct Node *link;
    int    value;
} Node;

单链表的一些性质
链表不一定是顺序存储的,它的节点可能分部于内存的各个地方.
单链表可以通过链表从开始遍历链表知道结束位置,但无法从相反方向进行遍历.

1.2 在单链表中插入

我们怎么才能把一个新节点插入到有序单链表中呢?加入要把7插入到单链表.(如果链表中的值为 1, 3, 5, 10, 11)
思路:从链表的起始位置开始,跟随指针直到找到第一个值大于7的节点,然后把这个新值插入到那个节点之前的位置.
有一个问题,当我们找到第一个大于7的节点时,指针可能指向了10,我们无法直到已经遍历过的指针了,我们也无法返回.解决这个问题的方法就是始终保存一个指向链表当前节点之前的那个节点指针.

//插入到一个有序的单链表,函数的参数是一个指向链表第一个节点的指针以及需要插入的值.
#include <stdlib.h>
#include <stdio.h>
#include "ssl_node.h"

#define FALSE 0
#define TRUE 1

int ssl_insert( Node *current, int new_value ) {
    Node *previous;
    Node *new;
    //寻找正确的插入位置,方法是按顺序访问链表,直到到达其值大于或等于新插入的值
    while( current->value < new_value ){
        previour = current;
        current = current->link;
    }
    //为新节点分配内存,并把新值存储到新节点中,如果内存分配失败,函数返回False
    new = (Node *)malloc( sizeof( Node ) );
    if( new == NULL )
        return FALSE;
    new->value = new_value;
    //把新节点插入到链表中,并返回TURE
    new->link = current;
    previous->link = new;
    return TURE;
}
//调用
result = ssl_insert( root, 7 );

猜你喜欢

转载自www.cnblogs.com/wjw-blog/p/10451853.html
今日推荐