C和指针---使用结构和指针

1.链表

链表(linked list)就一些包含数据的独立数据结构(通常称为节点)的集合。链表中的每个节点通过链或指针连接在一起,程序通过指针访问链表中的节点,通常节点是动态分配的。

2.单链表

在单链表中,每个节点包含一个指向链表下一个节点的指针,链表最后一个节点的指针字段的值为NULL,提示链表后面不再有其他节点。
为了记住链表的起始位置,可以使用一个根指针(root pointer),根指针指向链表的第1个节点。
单链表可以通过链从开始位置遍历链表直到结束位置,但链表无法从相反的方向进行遍历。需要始终保存一个指向链表当前节点之前的那个节点的指针
实例:
typedef struct NODE
{
struct NODE link;
int value;
} Node;
/
*************************************************************************
插入到一个有序单链表,函数的参数是一个指向链表第一个节点的指针,以及一个需要值
**************************************************************************/
#include <stdlib.h>
#include <stdio.h>

#define FALSE 0
#define TURE 1

int sll_insert (register Node **linkp, int newValue)
{
register Node *current;
register Node new;
/

**寻找正确的插入位置,方法是按序访问链表,直到到达一个其值大于或等于新值的节点
*/
while ((current = *linkp) != NULL && current->value < newValue)
{
*linkp = &current->link;
}

/*
**为新节点分配内存,并把新值存储到新节点中,如果内存分配失败,则返回
*/
new = (Node )malloc(sizeof(Node));
if (new == NULL)
{
return FALSE;
}
new->value = newValue;
/

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

3.双链表

单链表的替代方案是双链表,在一个双链表中,每个节点都包含两个指针(指向前一个节点的指针和指向后一个节点的指针),使得我们任何方向的遍历。
typedef struct NODE
{
struct NODE fwd;
struct NODE bwd;
int value;
} Node;
根节点的fwd字段指向链表的第1个节点,根节点的bwd字段指向链表的最后一个节点。如果链表为空,这两个字段都为NULL。
/
*********************************************************************************************************
把一个新值插入到一个双链表中,rootp是一个指向根节点的指针
**value 是需要插入的新值
*********************************************************************************************************/
#include <stdlib.h>
#include <stdio.h>
int dll_insert(register Node *rootp, int value)
{
register Node *this;
register Node *next;
register Node newNode;
/

**查看value是否已存在于链表中,如果是就返回
**否则,为新值创建一个新节点
**“this”将指向应该在新节点之前的那个节点
**next将指向应该在新节点之后的那个节点
*/
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;
if (next != NULL)
next->bwd = newNode;
else
rootp->bwd = newNode;
return 1;
}
}
双链表中的每个节点包含两个link字段:其中一个指向链表的下一个节点,另外一个指向链表的前一个节点,双链表有两个根指针,分别指向第一个节点和最后一个节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值