上班摸鱼-手写线性链表

面试必备

<?php

define("OK",true);
define("ERROR",false);

class node
{
    /**
     * @var node $next
     */
    public $next;
    public $data;
}

/* 初始化链式线性表 */
function InitList(&$L): bool
{
    $L= new node(); /* 产生头结点,并使L指向此头结点 */
    $L->next=NULL; /* 指针域为空 */
    return OK;
}

/* 初始条件:链式线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
function ListEmpty($L): bool
{
    if($L->next)
        return FALSE;
    else
        return TRUE;
}

/* 初始条件:链式线性表L已存在。操作结果:将L重置为空表 */
function ClearList($L): bool
{
	$p=$L->next;           /*  p指向第一个结点 */
	while($p)                /*  没到表尾 */
    {
        $q=$p->next;
        unset($p);
        $p=$q;
	}
	$L->next=NULL;        /* 头结点指针域为空 */
	return OK;
}


/* 初始条件:链式线性表L已存在 */
/* 操作结果:依次对L的每个数据元素输出 */
function ListTraverse($L): bool
{
    $p = $L->next;
    while ($p) {
        visit($p->data);
        $p = $p->next;
    }
    printf("\n");
    return OK;
}

function visit($data): bool
{
    printf("%d ", $data);
    return OK;
}

/* 初始条件:链式线性表L已存在。操作结果:返回L中数据元素个数 */
function ListLength(&$L): int
{
    $i=0;
    $p=$L->next; /* p指向第一个结点 */
    while($p)
    {
        $i++;
        $p=$p->next;
    }
    return $i;
}

function ListInsert(&$L, int $i, $e): bool
{
    $p = $L;
    $j = 1;
    while ($p && $j < $i)     /* 寻找第i个结点 */ {
        $p = $p->next;
        ++$j;
    }
    if (!$p || $j > $i)
        return ERROR;   /* 第i个元素不存在 */
    $s = new node();  /*  生成新结点 */
    $s->data = $e;
    $s->next = $p->next;      /* 将p的后继结点赋值给s的后继  */
    $p->next = $s;          /* 将s赋值给p的后继 */
    return OK;
}

/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
function ListDelete($L,int $i,node $e): bool
{
	$p = $L;
	$j = 1;
	while ($p->next && $j < $i)	/* 遍历寻找第i个元素 */
	{
        $p = $p->next;
        ++$j;
	}
	if (!($p->next) || $j > $i)
	    return ERROR;           /* 第i个元素不存在 */
	$q = $p->next;
	$p->next = $q->next;			/* 将q的后继赋值给p的后继 */
	$e = $q->data;               /* 将q结点中的数据给e */
	unset($q);                    /* 让系统回收此结点,释放内存 */
	return OK;
}



$node = null;
InitList($node);
for ($j = 1; $j <= 5; $j++)
    $i = ListInsert($node, 1, $j);

ListTraverse($node);

$e = new node();
ListDelete($node,5,$e); /* 删除第5个数据 */
printf("删除第%d个的元素值为:%d\n",5,$e);
ListTraverse($node);
ClearList($node);





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值